Невозможно установить внешние ключи для абстрактных моделей в Django. Однако вы можете установить внешние ключи для не абстрактного базового класса. Единственное ограничение заключается в том, что обратное отношение внешнего ключа вернет экземпляры базового класса. Вы можете обойти это ограничение, используя django-polymorphic.
Джанго Полиморфные позволяет запрашивать объекты базового класса, но получают экземпляры класса ребенка:
>>> 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"> ]
Чтобы использовать Джанго полиморфные вам нужно только объявить свои модели с полиморфной моделью в качестве базового класса:
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)
Внешние ключи также будут возвращать экземпляры класса ребенка, который является то, что вам нужно я предполагаю:
# 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)> ]
Учтите, что эти запросы будут slightly less performant.
Я не знал ПолиморфизмМодель ... возможно, это может мне помочь. Я не понимаю один аспект: PolymorphicModel основан на GenericRelation? Когда необходимо использовать GenericRelation (content-type) вместо PolymorphicModel? Вероятно, этот вопрос выходит за рамки моего первоначального вопроса ... – Safari
Общие отношения не связаны с полиморфными моделями. Общие отношения полезны для типовой модели, которую у вас есть в ваших приложениях, и которые имеют внешние ключи для принципиально разных моделей. У меня есть общая модель Image в моем приложении, и у моделей Event и Team могут быть изображения. Это общие отношения. У меня также есть модель InternationalTeam, которая наследуется от Team, а затем также команды будут иметь Images, без необходимости указывать это явно в модели. –