我的模型设置如下(这是一个例子而不是我的实际模型)
class modelA(Model):
field1 = CharField(max_length=50)
class modelB(modelA):
field2 = CharField(max_length=50)
class anotherModel(Model):
connection = models.ForeignKey(modelA)
title = CharField(max_length=50)
我是否可以连接到存储在anotherModel中的modelB,因为modelB继承自模型A.
mod_b = modelB()
conn_b = anotherModel()
conn_b.connection = mod_b
如果没有,我将如何处理?
由于
答案 0 :(得分:4)
来自Django内置 ContentTypes 模块的Generic Relations feature是处理多态外键的最受支持的方式。
您需要在模型中添加一些支持字段,以便框架可以确定外键所代表的特定类,但除此之外,它将处理相当透明地加载正确类型。
在你的情况下,它会是这样的:
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
# modelA and modelB as before
class anotherModel(Model):
connection_content_type = models.ForeignKey(ContentType)
connection_object_id = models.PositiveIntegerField()
connection = generic.GenericForeignKey('connection_content_type',
'connection_object_id')
请注意,您不需要自己设置/读取connection_content_type
或connection_object_id
字段...泛型框架将为您处理,他们只需要在那里为泛型工作
mod_a = modelA()
mod_b = modelB()
conn = anotherModel()
conn.connection = mod_b
conn.save()
conn.connection = mod_a # change your mind
conn.save()
答案 1 :(得分:0)
是的,你可以这样做。如果你将“anotherModel”中的ForeignKey添加到modelB并尝试运行syncdb,它会咆哮你说你需要指定一个“related_name”。因此,在一个(或两个)ForeignKey字段上添加一个related_name属性。
您还应该阅读:http://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name以获取有关related_name的更多信息。