Django: Models bidirektional Verbinden

Django, Flask, Bottle, WSGI, CGI…
Antworten
SeBu
User
Beiträge: 16
Registriert: Samstag 4. Januar 2014, 11:36

Hi,

ich würde gern folgende Relation für die Models "Publisher" und "Series" erreichen, zur besseren Erklärung mal als Dict:

Code: Alles auswählen

{"Publisher1": ["Series1", "Series2"], "Publisher2": ["Series3", "Series4"]}
wobei die Series einzigartig im Dict sein sollen.

Versucht habe ich das mit:

Code: Alles auswählen

class Publisher(models.Model):
    published_series = models.ManyToManyField("Series", related_name="pub_series_name", blank=True)

class Series(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.SET_NULL, blank=True, null=True)

Wenn ich meinen Fehler richtig verstanden habe, dann werden mir zwei separate Einträge erzeugt und keine bidirektionale Verbindung.

Mit welchen Werkzeugn kann ich die Einträge jetzt aber verknüpfen/bidirektional machen, sodass eine Änderung auf der Admin Seite bei einer Serie auch beim entsprechenden Publisher vollzogen wird und umgekehrt, man also im Admin Bereich bei beiden Eintragen die gleiche(n) Verbindung(en) sieht?

Es sollte dann auch möglich sein, bei einem Publisher eine vorhandene Serie hinzuzufügen, woraufhin sie dann auch aus der anderen Publisher-Liste entfernt wird. (Müsste man dafür dann die geerbte "Hinzufügen"-Funktion überschreiben oder geht das auch anders?)

Schon mal danke!
BlackJack

@SeBu: Du speicherst die Informationen irgendwie mehrfach, denn ich verstehe nicht was das `ManyToMany` bei `Publisher` zu suchen hat. Nach Deiner Beschreibung brauchst Du nur den Fremdschlüssel bei `Series`. Welche Serien/Reihen ein Publisher veröffentlich hat, kannst Du alleine mit der Information ja einfach abfragen, und wenn Du den Publisher bei einer Series änderst, dann wird das auch im Ergebnis bei dieser Abfrage wie gewünscht berücksichtigt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

einzigartig = jede Serie ist genau einem Publisher zugewiesen? Dann ist es in der Tat ein einfaches "one-to-many" mit einem ForeignKey.

Mal ein Minimalbeispiel:

models.py:

Code: Alles auswählen

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=50)

class Serie(models.Model):
    name = models.CharField(max_length=100)
    published_by = models.ForeignKey(Publisher)
Mit Daten befüllen (alles in der Django Python-Shell):

[codebox=pycon file=Unbenannt.txt]>>> from myapp.models import Publisher, Serie
>>> my_publisher = Publisher(name='Otto Normal')
>>> my_other_publisher = Publisher(name='Rainer Titan')
>>> my_publisher.save()
>>> my_other_publisher.save()
>>> serie1 = Serie(name='Ferien im Westerwald', published_by=my_publisher)
>>> serie2 = Serie(name='Ferien im Westerwals - Jetzt erst recht', published_by=my_publisher)
>>> serie1.save()
>>> serie2.save()
>>> serie3 = Serie(name='Angeln auf Island', published_by=my_other_publisher)
>>> serie3.save()
>>> Serie.objects.filter(published_by__name='Otto Normal')
[<Serie: Serie object>, <Serie: Serie object>]
>>> p = Publisher.objects.get(id=1)
>>> p.serie_set.all()
[<Serie: Serie object>, <Serie: Serie object>]
>>> p2 = Publisher.objects.get(id=2)
>>> p2.serie_set.all()
[<Serie: Serie object>]
>>> [/code]

Gruß, noisefloor
SeBu
User
Beiträge: 16
Registriert: Samstag 4. Januar 2014, 11:36

Vielen Dank für die Hilfe, jetzt ist mir das Prinzip klar.
Dann mache ich mich mal an die Views :D
Antworten