2017-12-07 2 views
0

Ich versuche herauszufinden, wie man eine Eins-zu-Viele-Beziehung zwischen zwei Modellen definiert. Die Schwierigkeit hierbei ist, dass ich keines der Modelle anfassen will und daher nicht den üblichen ForeignKey (Many-to-One) verwenden kann.Django-Eins-zu-Viele-Beziehung in Modellen (nicht über Lookups)

Es gibt viele Fragen zu diesem Thema, aber sie alle sprechen entweder über das Nachschlagen (Reverse ForeignKey-Lookup) oder sie schlagen vor, nur einen Fremdschlüssel zu einer Seite hinzuzufügen. Hier ist eine similar question. Ich werde das gleiche Codebeispiel verwenden. Dies ist, was ich suche:

class Dude(models.Model): 
    numbers = models.OneToManyField('PhoneNumber') 

class PhoneNumber(models.Model): 
    number = models.CharField() 

Normalerweise würde ich voran gehen und nur einen Fremdschlüssel zu Phone hinzufügen, wie in vielen Antworten vorgeschlagen:

class PhoneNumber(models.Model): 
    dude = models.ForeignKey(Dude, related_name='numbers') 

Aber in meiner Situation würde Ich mag zu Berühren Sie nicht das PhoneNumber-Modell und definieren Sie daher etwas im Dude-Modell.

Der Grund dafür ist, dass ich ein Modell definiere, das einen besonderen Umstand beschreibt, der selten benutzt wird. Wenn ich einen ForeignKey im (PhoneNumber) -Modell verwende, würde 99,9% aller Instanzen dieses Feld leer lassen. Ich mag die Idee nicht, ein Feld zu haben, das immer leer ist - vielleicht ist das mein Problem.

Eine mögliche Problemumgehung besteht darin, ein Viele-zu-Viele-Feld zu definieren und dann eine Logik hinzuzufügen, die "viele" auf der einen Seite verhindert und die andere Seite nicht leer macht.

Ich hoffe, ich könnte mein Problem klar beschreiben.

Frage: Gibt es eine Möglichkeit, eine Eins-zu-viele-Beziehung zu definieren? Gibt es eine bessere Lösung mit einem anderen Ansatz für mein Problem?

P.S. Der einzige Treffer, den ich von den Django-Dokumenten bekomme, ist ein Feldattribut one_to_many, das, wie ich vermute, für das Nachschlagen verwendet wird.

+0

Mögliches Duplikat von [Wie man eine Eins-zu-Viele-Beziehung in Django ausdrückt] (https://stackoverflow.com/questions/6928692/how-to-express-a-one-in- Viele-Beziehung-in-Django) – ptr

+0

Es ist absolut nichts falsch daran, eine zu haben Feld, das normalerweise leer ist.Es nimmt keinen nennenswerten Platz in Ihrer Datenbank ein, wenn Sie sich darüber Sorgen machen. –

+0

Ich verlinke diese Frage tatsächlich als "ähnliche Frage" in meiner Frage. Der Grund, warum die Antwort auf diese Frage nicht befriedigend ist, ist, dass ich das Modell von phoneNumber nicht berühren möchte. – jimfawkes

Antwort

0

Wenn ich einen ForeignKey für das Modell (PhoneNumber) verwendet hätte, hätte ich 99,9% aller Modelle dieses Feld leer lassen. Ich mag die Idee nicht, ein Feld zu haben, das immer leer ist - vielleicht ist das mein Problem.

Es ist eine Art von. Um eine Eins-zu-viele zu definieren, verwenden Sie ForeignKey, und dies muss auf dem PhoneNumber Modell sein. Soweit ich sehen kann, hat dies keine Nachteile. Es hört sich so an, als ob das Hauptproblem darin besteht, dass Sie es gewohnt sind, eine Bibliothek zu benutzen, die das anders herum tut, und so scheint es Ihnen seltsam, es so zu tun.

Ich fürchte, ich verstehe nicht, was Sie mit

99,9% aller Modelle lassen Sie dieses Feld leer

Sie können es nicht leer lassen, wenn Sie es ihnen ermöglichen, durch Einstellung null=True, blank=True usw.

+0

good spot, bearbeitet – ptr

+0

Ich wollte sagen, 99,9% aller Instanzen dieses Modells lassen es leer. Ich müsste null und leer als True definieren, ja. – jimfawkes

+0

Ich bin es gewohnt, den ForeignKey im PhoneNumber Model zu definieren, gibt es eine andere Möglichkeit dies zu tun? Ich würde es gerne anders herum machen, aber ich weiß nicht wie. im Grunde ein umgekehrter ForeignKey. – jimfawkes