django继承与foreignkey领域

Joh*_*ohn 6 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)
Run Code Online (Sandbox Code Playgroud)

我是否可以与存储在anotherModel中的modelB建立连接,因为modelB继承自模型A.

mod_b = modelB()
conn_b =  anotherModel()
conn_b.connection = mod_b
Run Code Online (Sandbox Code Playgroud)

如果不是我怎么处理这个?

谢谢

Jar*_*die 5

来自 Django 内置ContentTypes模块的通用关系功能是处理多态外键的最受支持的方式。

您需要向模型添加一些支持字段,以便框架可以确定外键代表哪个特定类,但除此之外,它将相当透明地处理加载正确的类型。

在你的情况下,它会是这样的:

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')
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要自己设置/读取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()
Run Code Online (Sandbox Code Playgroud)