Frage

Angesichts der folgenden Modelle: (Machen Sie sich nichts aus, was die Textfelder dort nur zur Illustration gibt)

class Base(models.Model):
   field1 = models.TextField()

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()


class Content(models.Model):
    aso_items = models.ManyToManyField('Base')

Nach diesen Definitionen kann ein Inhaltsobjekt mehr als einem Basisobjekt zugeordnet werden, z. Ein Interview (= Inhaltsobjekt) kann mit einem Musiker (= Child1 -Objekt), einem Filmdirektor (= Child2) usw. verknüpft werden.

Für meine Frage: Ist es möglich, Inhaltsobjekte gemäß dem Modell der ASO_ITEMS zu filtern? Ein Beispiel: Angenommen, ich möchte, dass ein QuerySet mit allen Inhaltsobjekten, die einem bestimmten Objekt von Child1 zugeordnet sind (z. B. alle mit dem Musiker Bob Dylan, verbundenen Interviews), wie kann ich das erreichen?

Was ist, wenn ich ein Queryset mit allen Inhaltsobjekten enthält, die mit Kindern von Kindern verbunden sind? (Z. B. alle Interviews, die mit Musikern verbunden sind) Wie ändert sich das die Filterung?

Vielen Dank im Voraus PS: Ich habe einige Probleme mit dem weißen Raum in der Vorschau, vergib mir

War es hilfreich?

Lösung

Sie sollten den Abschnitt der Django -Dokumente bezüglich der Verwendung überprüfen related_name Für abstrakte Basisklassen. http://docs.djangoproject.com/en/dev/topics/db/models/#be-carefel-with-related-name

Um die Dokumente zu zitieren:

Wenn Sie die verwenden related_nameAttribut auf einem Foreignkey oder Manytomanyfield müssen Sie immer einen eindeutigen umgekehrten Namen für das Feld angeben. Dies würde normalerweise ein Problem in abstrakten Basisklassen verursachen, da die Felder in dieser Klasse in jeden der Kinderklassen mit genau den gleichen Werten für die Attribute (einschließlich der Attribute) enthalten sind (einschließlich related_name) jedes Mal.

Um dieses Problem zu umgehen, sollte ein Teil des Namen %(class)s. Dies wird durch den niedrigeren Namen der untergeordneten Klasse ersetzt, in dem das Feld verwendet wird. Da jede Klasse einen anderen Namen hat, wird jeder verwandte Name unterschiedlich.

Mit diesen Informationen würde ich empfehlen, das M2M -Feld in die Basisklasse zu verschieben:

class Content(models.Model):
   # Add remaining fields for Content 
   pass

class Base(models.Model):
   field1 = models.TextField()
   items = models.ManyToManyField(Content,related_name="%(class)s_related")

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()

Andere Tipps

Anscheinend ist eine ausländische Beziehung (oder viele Tomanien) mit einer abstrakten Klasse nicht zulässig. Ich erhalte den folgenden Fehler: "AsSertionError: ForeignKey kann keine Beziehung zur abstrakten Klasse Artest definieren".

Eine mögliche Lösung besteht darin, die Basisklasse als nicht abstrakt zu definieren. Dies impliziert jedoch, dass man Modelle der Basisklasse instanziieren könnte. Welches ist nicht das Verhalten, das ich will. (Schließlich war es eine abstrakte Klasse) Hat jemand das gleiche Problem anfängt. Wie haben Sie ihn gelöst? Irgendwelche Alternativen?

Sich ansehen http://www.djangoproject.com/documentation/models/generic_relations/ Das durchläuft allgemeine Beziehungen. Ihr Inhaltsmodell würde mit ihrem TaggedItem -Modell übereinstimmen, und Ihr Basismodell würde mit ihrem Tier-/Gemüse-/Mineralmodell (wobei Child1 und Child2 erweitert) übereinstimmen.

Wenn Sie alle Inhaltsobjekte für ein einzelnes Kind erhalten, ist dies (vorausgesetzt, Sie setzen die Generierung auf Inhalt in der Basis):

child_contents = childObject.contents.all()

Und um alle Inhaltsobjekte für ein Modell zu erhalten:

ctype = ContentType.objects.get_for_model(Child1)
all_child_contents = Content.objects.filter(content_type=ctype)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top