我有一个具有以下模型的现有应用
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)
光靠自己是不够的。这将覆盖 firstname
和 lastname
的 contact
至 ""
.为避免这种情况,您必须将每个字段显式分配给 Journalist
.
关于python - Django 模型继承问题。怎么解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871094/