Es ist nicht möglich, Fremdschlüssel zu abstrakten Modelle in Django zu installieren. Sie können jedoch Fremdschlüssel zu einer nicht abstrakten Basisklasse installieren. Die einzige Einschränkung besteht darin, dass die umgekehrte Fremdschlüsselbeziehung die Basisklasseninstanzen zurückgibt. Sie können diese Einschränkung umgehen, indem Sie django-polymorphic verwenden.
Django Polymorphe können Sie die Basisklasse Objekte abzufragen, sondern ruft die Kindklasse Instanzen:
>>> 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"> ]
verwenden django polymorphen Sie brauchen nur Ihre Modelle mit Polymorphe Modell als Basisklasse zu deklarieren:
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)
Fremdschlüssel wird auch die untergeordneten Instanzen der Klasse zurückkehren, das ist, was Sie brauchen, nehme ich an:
# 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)> ]
Berücksichtigen Sie, dass diese Abfragen slightly less performant sind.
Ich wusste nicht PolymorphicModel ... wahrscheinlich kann mir das helfen. Ich verstehe keinen Aspekt: PolymorphicModel basiert auf GenericRelation? Wann ist es notwendig, GenericRelation (content-type) anstelle von PolymorphicModel zu verwenden? Wahrscheinlich ist diese Frage außerhalb des Kontexts meiner ursprünglichen Frage ... – Safari
Generische Relationen sind nicht verwandt mit polymorphen Modellen. Generische Beziehungen sind nützlich für die Art von generischem Modell, das Sie in Ihren Anwendungen haben und die Fremdschlüssel für grundlegend unterschiedliche Modelle haben. Ich habe ein generisches Bildmodell in meiner Anwendung, und beide Event- und Teammodelle können Bilder haben. Dies ist eine generische Beziehung. Ich habe auch ein InternationalTeam-Modell, das von Team erbt, und dann haben Teams auch Bilder, ohne dass ich das explizit im Modell angeben muss. –