django:将继承的模型基类切换到不同的子类

django:将继承的模型基类切换到不同的子类,django,django-models,Django,Django Models,基类模型和继承模型如下所示: class Profile(models.Model): user = models.ForeignKey(User, unique=True) ... class Student(Profile): ... class Teacher(Profile): ... 我有一个Student类的对象(其数据存储在db-Profile table中的两个表中,一个Student表有一个指向Profile table的指针)。我需要将该配置文件表行

基类模型和继承模型如下所示:

class Profile(models.Model):
   user = models.ForeignKey(User, unique=True)
   ...
class Student(Profile):
   ...
class Teacher(Profile):
   ...
我有一个Student类的对象(其数据存储在db-Profile table中的两个表中,一个Student表有一个指向Profile table的指针)。我需要将该配置文件表行指定给教师对象,并删除学生对象,即在不丢失配置文件表数据内容的情况下,同时保留该行的相同id。应该怎么做

谢谢,


任何帮助都将不胜感激。

在幕后,Django在学生和教师模型上创建了一个名为profile_ptr_id的字段。因此,您可能需要对其进行操作。由于Django的具体继承是如何工作的,每个学生和教师对象的主键实际上就是这个profile\u ptr\u id字段。因此,我不确定是否允许同时使用具有相同profile_ptr_id的Student和Teacher对象

您可以尝试以下方法来解决此问题:

  • 创建新的纵断面对象
  • 将学生对象的profile_ptr_id设置为新profile对象的id
  • 将教师对象的profile_ptr_id设置为学生对象先前指向的旧profile对象的id
  • 删除学生对象

我从未尝试过这个方法,所以我真的不能说它是否有效……

如果你有一个学生,你想成为一名有部分或全部字段的教师,并且你可以负担得起键入字段的费用,你可以做:

teacher = Teacher(id=student.id, user=student.user, 
                  name=student.name, email=student.email, ...)
student.delete()
teacher.save()

在保存具有相同ID的新对象之前,设置ID并删除旧对象是很重要的。

编程还是仅保存一个任务?如果是,我建议您在数据库中手动执行。否则,不能在指定Profile\u id=所需内容的位置创建新教师对象。然后删除学生?必须通过编程完成,我尝试过的另一个选项(即profile_id=)无法正确获得,实际上,在继承模型的情况下,表字段名类似于profile_ptr_id,我用的是那个,但没用。。事实上,我已经有一些数据存储在参考早期的配置文件ID中(当它用于学生时),现在如果该学生被提升为教师配置文件,我也需要保留这些数据,并且这些数据引用了配置文件ID(如果删除将丢失)…对。我写的步骤列表将旧的配置文件移动到教师,保留所有信息。