python - Django 模型继承问题。怎么解决?

标签 python django inheritance django-models django-orm

我有一个具有以下模型的现有应用

class Contact(models.Model):
     lastname = models.CharField(max_length=200)
     firstname = models.CharField(max_length=200)
     ...

class Journalist(Contact):
     pass

我的数据库中有一个联系人,我希望它成为一个记者

在原始 sql 中,它看起来像 insert into app_journalist values (25624); 一样简单。在此示例中,25624 是现有联系人的 ID。它似乎工作正常,django 应用程序似乎很开心。

但是,我想用 django ORM 做同样的事情。我尝试了几种想法,例如强制记者 ID (Journalist(id=25624)),但它会创建一个新联系人而不是链接到现有联系人。

Django ORM 可以做到这一点吗?怎么办?

预先感谢您的帮助

最佳答案

解决此问题的一种方法是(不更改模型结构)设置 contact_ptr Journalist 的属性实例到适当的 Contact实例。例如

contact = Contact.objects.get(pk = 25624)
journalist = Journalist(contact_ptr = contact)
journalist.save()

如果您首先查看表格 app_journalist,这会变得更容易理解.它只有一列,contact_ptr_id .所以当你执行insert into app_journalist values (25624)你正在设置 contact_ptr_id = 25624在 SQL 级别。相应地你应该设置contact_ptr = <instance of Contact>在 ORM 级别。

更新

还有其他方法可以解决该问题,但它们需要更改您现有的模型。作为@bugspy.net pointed out您可以使用通用关系。或者,您可以声明额外的 type指定联系人是记者、同事等的字段。

更新 2

也看看这个demo snippet (和 complete code )让您可以使用多态继承(SQLAlchemy 已经这样做了)。

更新 3

正如@luc 自己指出的(见下面的评论)

journalist = Journalist(contact_ptr = contact)

光靠自己是不够的。这将覆盖 firstnamelastnamecontact"" .为避免这种情况,您必须将每个字段显式分配给 Journalist .

关于python - Django 模型继承问题。怎么解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871094/

相关文章:

java - 将现有 jaxb 类结构的继承更改为组合,保持当前 xml 结构不变

python - 无法使用 Kafka-Python 的反序列化器从 Kafka 消费 JSON 消息

python - 不同数据库上的 Django MySQL

django 扩展问题 - 子模板未显示

C# 虚拟方法

c# - 为了惰性访问,你如何在本地封装一个字段值?

python - 为 Pyspark 数据框按多列重新分区

python - 属性错误 : 'module' object has no attribute 'audio_fadein'

python - 保存为 HDF5 的图像未着色

python - Gunicorn+Django+Heroku。 Python路径问题