0

Ich möchte eine Beziehung zwischen einer Story-Klasse und einer Series-Klasse modellieren. (i.e. eine Trilogie von Romanen) Die Beziehung ist eine "eins zu viele" (eine Reihe kann viele Geschichten enthalten, aber eine Geschichte kann nur Teil einer Serie sein). Modell weise könnte dies einfach durch einen Fremdschlüssel auf Geschichte gelöst werden,Assoziationsattribute in einer Django-Eins-zu-Viele-Fremdschlüsselbeziehung

part_of = models.ForeignKey(Series 
          , on_delete=models.CASCADE 
          , related_name='contains_story') 

Aber ich eine Sequenznummer als Attribut dieser Beziehung möchte. (1: Die lange Erde, 2: Der lange Krieg, 3: Der lange Mars, ...). Ich könnte es zu einem Attribut von Story machen, aber das ist nicht sauber, eine Story, die nicht Teil einer Serie ist, sollte keine Sequenznummer haben.

In einem "viele-zu-viele" kann dies mit der Option "durch" gelöst werden. durch Angabe einer Klasse und Hinzufügen von Attributen zu dieser Klasse.

part_of = models.ManyToManyField(Series, through='SeriesPart') 

Aber „Teil einer Serie“ ist kein „many-to-many“ Beziehung und ich so modelliert es vermeiden wollen und es in Code zu beschränken hat, so wie soll ich das am besten lösen?

+0

Ich bin mir nicht sicher über Ihren Anwendungsfall, aber klingt wie Fremdschlüssel ist der Weg, aber ich verstehe nicht, warum Sie keine Seriennummer auf "Story" haben wollen. –

+0

es ist keine Seriennummer es ist seine Reihenfolge in einer Sequenz. Und eine Story, die nicht Teil einer Sequenz ist, sollte dieses Attribut nicht haben. – Chabu

Antwort

0

Ich bin mir nicht sicher, ob dein Einwand viel Sinn ergibt. Der Grund, warum Sie ein zusätzliches Attribut in der Durchgangstabelle einer Viele-zu-Viele-Beziehung speichern könnten, liegt genau darin, dass jede Seite der Beziehung mehrere Elemente haben kann und der Attributwert nur für eine bestimmte Kombination relevant ist. (Im Fall der example in the Django docs, war John in den Quarrymen, bevor er in dem Beatles war, so gibt es separate joined_date Werte für John < -> Quarrymen, John < -> Beatles, und Paul <. -> Beatles)

In Ihrem Fall kann eine Geschichte nur Teil einer Serie sein. Es gibt keine andere Position für The Long Earth außer als Teil 1 der Pratchett/Baxter-Reihe; es kann nicht gleichzeitig Teil 1, sondern auch Teil 2 von etwas anderem sein. Es gibt also keinen Grund, die Seriennummer nicht im Story-Modell selbst zu speichern. Stories, die nicht Teil einer Serie sind, können einfach leer bleiben, genauso wie sie den FK auf Serien leer setzen.

+0

Das woks aber es ist nicht das sauberste der Modelle. Jetzt habe ich folgendes getan. 'Klasse SeriesPart (models.Model):' 'series = models.ForeignKey (Serie, on_delete = models.CASCADE)' 'Geschichte = models.ForeignKey (Story, on_delete = models.CASCADE)' Sequenz '= models.PositiveSmallIntegerField() ' – Chabu

Verwandte Themen