Nie można zainstalować kluczy obcych w modelach abstrakcyjnych w Django. Można jednak zainstalować klucze obce na nie abstrakcyjną klasę podstawową. Jedynym ograniczeniem jest to, że odwrotna relacja klucza obcego zwróci instancje klasy podstawowej. Można obejść to ograniczenie, używając django-polymorphic.
Django polimorficzne pozwala na zapytanie obiektów klasy bazowej, ale pobiera instancje klasy dziecko:
>>> 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"> ]
używać Django polimorficzny wystarczy zadeklarować swoje modele z polimorficzna modelu jako klasy bazowej:
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)
klucze obce będą również zwracać instancje klasy dziecko, co jest, co trzeba Przypuszczam:
# 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)> ]
Należy wziąć pod uwagę, że zapytania te będą slightly less performant.
Nie znałem PolymorphicModel ... prawdopodobnie to może mi pomóc. Nie rozumiem jednego aspektu: PolymorphicModel opiera się na GenericRelation? Kiedy należy użyć GenericRelation (typ zawartości) zamiast PolymorphicModel? Prawdopodobnie to pytanie jest poza kontekstem mojego pierwotnego pytania ... – Safari
Relacje ogólne nie są powiązane z modelami polimorficznymi. Relacje generyczne są przydatne dla rodzaju ogólnego modelu, który masz w swoich aplikacjach i które mają klucze obce dla zasadniczo różnych modeli. Mam ogólny model obrazu w mojej aplikacji, a modele zdarzeń i zespołów mogą mieć obrazy. To jest ogólny związek. Posiadam również model InternationalTeam, który dziedziczy po Zespole, a następnie także Teamy będą miały Obrazy, bez konieczności określania tego wyraźnie w modelu. –