<p>在Django中不可能为抽象模型安装外键。
但是,您可以将外键安装到非抽象基类。唯一的限制是反向外键关系将返回基类实例。
您可以使用<a href="https://django-polymorphic.readthedocs.org/en/latest/" rel="noreferrer">django-polymorphic</a>来绕过此限制。</p>
<p>Django多态允许您查询基类对象,但检索子类实例:</p>
<pre><code>>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")
>>> Project.objects.all()
[ <Project: id 1, topic "Department Party">,
<ArtProject: id 2, topic "Painting with Tim", artist "T. Turner">,
<ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]
</code></pre>
<p>要使用django polymorphic,只需将具有polymorphic Model的模型声明为基类:</p>
<pre><code>from django.db import models
from polymorphic.models import PolymorphicModel
class ModelA(PolymorphicModel):
field1 = models.CharField(max_length=10)
class ModelB(ModelA):
field2 = models.CharField(max_length=10)
class ModelC(ModelB):
field3 = models.CharField(max_length=10)
</code></pre>
<p>外键还将返回子类实例,这是您需要的,我假设:</p>
<pre><code># The model holding the relation may be any kind of model, polymorphic or not
class RelatingModel(models.Model):
many2many = models.ManyToManyField('ModelA') # ManyToMany relation to a polymorphic model
>>> o=RelatingModel.objects.create()
>>> o.many2many.add(ModelA.objects.get(id=1))
>>> o.many2many.add(ModelB.objects.get(id=2))
>>> o.many2many.add(ModelC.objects.get(id=3))
>>> o.many2many.all()
[ <ModelA: id 1, field1 (CharField)>,
<ModelB: id 2, field1 (CharField), field2 (CharField)>,
<ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]
</code></pre>
<p>考虑到这些查询将是<a href="https://django-polymorphic.readthedocs.org/en/latest/performance.html" rel="noreferrer">slightly less performant</a>。</p>