Kann Django automatisch ein verwandtes Eins-zu-Eins-Modell erstellen?
Habe ich zwei Modelle in verschiedenen apps: modelA und modelB. Sie haben eine eins-zu-eins-Beziehung. Gibt es eine Möglichkeit, django automatisch erstellen und speichern ModelB wenn modelA gespeichert ist?
class ModelA(models.Model):
name = models.CharField(max_length=30)
class ModelB(models.Model):
thing = models.OneToOneField(ModelA, primary_key=True)
num_widgets = IntegerField(default=0)
Wenn ich speichern eine neue ModelA ich möchte einen Eintrag gespeichert werden automatisch in ModelB. Wie kann ich dies tun? Gibt es eine Möglichkeit, um anzugeben, dass in ModelA? Oder ist dies nicht möglich, und ich würde nur brauchen, um erstellen und speichern ModelB in der Ansicht?
Bearbeitet, zu sagen, die Modelle sind in verschiedenen apps.
InformationsquelleAutor der Frage vagabond | 2009-10-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf die AutoOneToOneField in django-das nervt. Aus den docs:
(django-ärgerlich ist eine tolle kleine Bibliothek, beinhaltet Perlen wie die render_to Dekorators und den get_object_or_None und get_config Funktionen)
InformationsquelleAutor der Antwort John Paulett
Wie m000 darauf hingewiesen, Ihre Modelle gibt es in verschiedenen apps. Oft Sie apps verwenden, die Sie nicht geschrieben haben, so zu erlauben, updates Sie benötigen eine entkoppelte Weise zu erstellen, die logisch verknüpften Modellen. Dies ist die bevorzugte Lösung ist meiner Meinung nach, und wir verwenden es in einem sehr großen Projekt.
Durch Verwendung von Signalen:
In Ihrem models.py:
Können Sie erstellen Sie eine separate app zu halten models.py Datei, wenn die beiden apps sind off-the-shelf.
InformationsquelleAutor der Antwort Dmitry
Der einfachste Weg ist, um überschreiben Sie die Methode zum speichern von ModelA:
InformationsquelleAutor der Antwort Jarret Hardie
Ich weiß, es ist ein bisschen spät, aber ich kam mit eine sauberere und elegantere Lösung.
Betrachten Sie diesen code:
Natürlich kann lambda als gut, solange Sie return integer id des verknüpften Objekts 🙂
InformationsquelleAutor der Antwort realmaniek
Könnten Sie die post_save-Hakender ausgelöst wird, nachdem ein Datensatz gespeichert wurde. Weitere Dokumentation zu django-Signale, siehe hier. Auf auf dieser Seitefinden Sie ein Beispiel, wie die Haken an deinem Modell.
InformationsquelleAutor der Antwort schneck
Ich denke, dass Sie verwenden möchten django ' s Modell-Vererbung. Dies ist nützlich, wenn Sie die folgende Aussage wahr ist: ModelA ist eine ModelB (wie, das Restaurant ist ein Ort).
Können Sie definieren:
Nun können Sie eine Instanz von ModelA und set Feld2 und Feld1. Wenn das Modell gespeichert wird, es wird auch erstellen Sie eine Instanz des ModelB die bekommt den Wert von field1 zugeordnet. All dies geschieht transparent im hintergrund.
Allerdings können Sie Folgendes tun:
InformationsquelleAutor der Antwort Gregor Müllegger
Erstellen Sie einfach eine Funktion, die erstellt und gibt eine leere ModelA, und legen Sie die standardmäßige benannte argument "Ding" zu dieser Funktion.
InformationsquelleAutor der Antwort user287544
Baute ich ein paar unterschiedliche Antworten (weil keiner von Ihnen arbeitete direkt aus der box für mich) und kam mit dieser. Dachte, es ist ziemlich sauber, also Teile ich es.
Es ist mit Signal, @Dmitry vorgeschlagen. Und wie @daniel-roseman kommentiert im @jarret-hardie ' s Antwort, Django-Admin versuchen, erstellen Sie das zugehörige Objekt für Sie manchmal (wenn Sie den Standardwert ändern, in der die inline-form), die ich lief in, so ist die hasattr überprüfen. Die nette Dekorateur Tipp ist von @shadfc Antwort in Erstellen OneToOne-Instanz auf die Erstellung des Modells
InformationsquelleAutor der Antwort jtlai