Django: Models bidirektional Verbinden

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

Django: Models bidirektional Verbinden

Beitragvon SeBu » Dienstag 3. Januar 2017, 14:24

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!
Benutzeravatar
BlackJack
Moderator
Beiträge: 31648
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Django: Models bidirektional Verbinden

Beitragvon BlackJack » Dienstag 3. Januar 2017, 15:25

@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.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
Benutzeravatar
noisefloor
User
Beiträge: 1576
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Django: Models bidirektional Verbinden

Beitragvon noisefloor » Mittwoch 4. Januar 2017, 20:34

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:

  1. from django.db import models
  2.  
  3. class Publisher(models.Model):
  4.     name = models.CharField(max_length=50)
  5.  
  6. class Serie(models.Model):
  7.     name = models.CharField(max_length=100)
  8.     published_by = models.ForeignKey(Publisher)


Mit Daten befüllen (alles in der Django Python-Shell):

  1. >>> from myapp.models import Publisher, Serie
  2. >>> my_publisher = Publisher(name='Otto Normal')
  3. >>> my_other_publisher = Publisher(name='Rainer Titan')
  4. >>> my_publisher.save()
  5. >>> my_other_publisher.save()
  6. >>> serie1 = Serie(name='Ferien im Westerwald', published_by=my_publisher)
  7. >>> serie2 = Serie(name='Ferien im Westerwals - Jetzt erst recht', published_by=my_publisher)
  8. >>> serie1.save()
  9. >>> serie2.save()
  10. >>> serie3 = Serie(name='Angeln auf Island', published_by=my_other_publisher)
  11. >>> serie3.save()
  12. >>> Serie.objects.filter(published_by__name='Otto Normal')
  13. [<Serie: Serie object>, <Serie: Serie object>]
  14. >>> p = Publisher.objects.get(id=1)
  15. >>> p.serie_set.all()
  16. [<Serie: Serie object>, <Serie: Serie object>]
  17. >>> p2 = Publisher.objects.get(id=2)
  18. >>> p2.serie_set.all()
  19. [<Serie: Serie object>]
  20. >>>


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

Re: Django: Models bidirektional Verbinden

Beitragvon SeBu » Donnerstag 5. Januar 2017, 11:16

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

Zurück zu „Webframeworks“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder