Frage Ich habe eine OneToOne-Beziehung zwischen zwei Objekten der gleichen Klasse in einer Django-App. Ist es möglich, die Einzigartigkeit dieser Beziehung durchzusetzen?


Ich habe Folgendes in meiner App:

class University(models.Model):
    ...
    sister_university = models.OneToOneField('self', related_name = 
                        'university_sister_university', 
                        blank=True, null=True, 
                        on_delete=models.SET_NULL)

Ich möchte nur, dass eine Universität mit einer anderen Universität in beiden Richtungen dieser Beziehung verbunden ist.

Wenn ich zum Beispiel in der Datenbank die Universität A als Schwesteruniversität der Universität B auswähle, möchte ich nur die Universität B auch als Schwesteruniversität unter der Universität A auswählen können. Wie auch immer, diese zweite Beziehung wird nicht erzwungen.

Zum Beispiel: Im Moment, unter der Django Admin Website, wenn ich zuerst die Universität A als Schwesteruniversität der Universität B auswähle, kann ich noch jede andere Universität als Schwesteruniversität der Universität A auswählen. Ich bin nicht gezwungen, nur Universität B zu wählen.

Ist es möglich, diese Eindeutigkeit auf Datenbankebene zu erzwingen? Gibt es einen besseren Weg, um das zu erreichen, was ich versuche?


14
2018-05-15 17:01


Ursprung


Antworten:


Ich denke, was Sie brauchen, ist diese Beziehung zu machen symmetrisch.

Sie können dies erreichen, indem Sie die save() Methode der University Modell:

def save(self, *args, **kwargs):
    super(University, self).save()
    if self.sister_university:
        self.sister_university.sister_university = self

8
2018-05-22 13:13



Ich habe diese Art von Dingen nie gemacht, aber ich denke, dass Sie diesen Prozess auf diese Weise machen können:

Methode: unique_together ()

Sie können verwenden Options.unique_together und legen Sie Ihre University_A und University_B als ein einzigartiges Paar fest.

unique_together = ("university_A", "university_B")

In deiner models.py Datei solltest du so etwas haben (mit einigen Problemen, aber die Idee ist da):

class University(models.Model):
    ...
    university = models.ForeignKey('self', on_delete=models.CASCADE)
    sister_university = models.ForeignKey('self', on_delete=models.CASCADE)
    class Meta:
        unique_together     = (('university','sister_university'),)

Sie sollten dort wertvolle Details finden: https://docs.djangoproject.com/de/2.0/ref/models/options/

Ich habe diesen Befehl nie ausprobiert, aber er scheint Ihr Problem entsprechend Ihrem Kontext zu lösen.


2
2018-05-22 09:05