django继承与foreignkey领域

时间:2010-06-01 12:22:57

标签: django django-models

我的模型设置如下(这是一个例子而不是我的实际模型)

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

如果没有,我将如何处理?

由于

2 个答案:

答案 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_typeconnection_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的更多信息。