Django vergleicht Modellinstanzen auf Gleichheit
Ich verstehe, dass, mit einer singleton-situation, die Sie durchführen können, eine solche operation als:
spam == eggs
und wenn spam
und eggs
sind Instanzen der gleichen Klasse mit dem gleichen Attribut-Werte zurück True
. In einem Django-Modell, das ist natürlich, weil sich zwei separate Instanzen des Modells werden nicht immer die gleichen, es sei denn, Sie haben die gleichen .pk
Wert.
Das problem mit diesem ist, dass, wenn ein Verweis auf eine Instanz hat Attribute, die aktualisiert wurden, von der middleware irgendwo auf dem Weg und es wurde nicht gespeichert, und Sie versuchen, es auf eine andere variable mit einem Verweis auf eine Instanz des gleichen Modells, wird es wieder False
natürlich, weil Sie verschiedene Werte für einige Attribute. Natürlich glaube ich nicht, sowas braucht ein singleton , aber ich Frage mich, ob es einige offizielle Djangonic (ha, neues Wort) Methode, die für die überprüfung dieser, oder sollte ich einfach schauen, dass die .pk
Wert ist das gleiche mit:
spam.pk == eggs.pk
Tut mir Leid, wenn das war eine riesige Verschwendung von Zeit, aber es scheint nur, wie es sein könnte, eine Methode, dies zu tun, und etwas vermisse ich, dass ich bereuen werde, die Straße hinunter, wenn ich es nicht finden.
UPDATE (02-27-2015)
Sollten Sie ignorieren den ersten Teil dieser Frage, da sollte man nicht vergleichen singletons mit ==
sondern mit is
. Singletons eigentlich nichts zu tun haben mit dieser Frage.
InformationsquelleAutor der Frage orokusaki | 2010-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom django-Dokumentation:
Vergleichen von zwei Modell-Instanzen, verwenden Sie die standard-Python-Vergleich-operator, das doppelte Gleichheitszeichen: ==. Hinter den kulissen, vergleicht die Primärschlüssel-Werte der beiden Modelle.
InformationsquelleAutor der Antwort Gunnar
spam.pk == eggs.pk
ist ein guter Weg, das zu tun.Können Sie
__eq__
zu deinem Modell, aber ich vermeiden, weil es verwirrend ist, wie==
kann bedeuten, verschiedene Dinge in verschiedenen Kontexten, z.B. ich möchte==
zu bedeuten Inhalt ist der gleiche, id abweichen kann, ist also wieder einmal beste Weg istBearbeiten:
btw in django Version 1.0.2 Model-Klasse definiert hat
__eq__
alsscheint zu sein wie spam.pk == Eier.pk als
pk
ist die Eigenschaft, die verwendet_get_pk_val
also ich sehe nicht, warum
spam == eggs
funktioniert nicht ?InformationsquelleAutor der Antwort Anurag Uniyal
Definieren Sie die Klasse'
__eq__
Methode zu ändern, dass Verhalten:http://docs.python.org/reference/datamodel.html
InformationsquelleAutor der Antwort piotr
Als von Django 1.9.7, den source code für die model-Instanz Gleichheit ist diese:
Ist, zwei Modell-Instanzen sind gleich, wenn die aus der gleichen Datenbank-Tabelle und haben den gleichen Primärschlüssel. Wenn entweder der primäre Schlüssel ist
None
Sie sind nur gleich, wenn theyr ' E das gleiche Objekt.(Also immer wieder auf die OP-Frage, einfach Vergleich der Instanzen wären gut.)
InformationsquelleAutor der Antwort Kevin Christopher Henry
Nur für das Protokoll, Vergleich:
ist gefährlich, wenn es irgendeine chance, dass einer von Ihnen könnte eine latente Modell-Instanz erstellt, indem das Modell.Objekte.raw () - Abfrage oder durch .defer() angewendet auf ein "normales" QuerySet.
Ich mehr details hier: Django QuerySet .defer () - problem - bug oder feature?
InformationsquelleAutor der Antwort Tomasz Zielinski
Als orokusaki Kommentare, "wenn weder die Instanz, die über einen Primärschlüssel verfügt, wird es wieder wahr immer". Wenn Sie wollen, dass dies funktioniert, können Sie erweitern Sie Ihr Modell wie folgt:
InformationsquelleAutor der Antwort afit
Wäre es seltsam, wenn zwei Modell-Instanzen im Vergleich als gleich, wenn Sie verschiedene Attribute. Die meisten der Zeit, würde nicht wünschenswert sein.
Was Sie wollen, ist ein besonderer Fall. Vergleichen
spam.pk == eggs.pk
ist eine gute Idee. Wenn es keinepk
noch, weil Sie noch nicht gespeichert worden ist, dann ist es schwieriger zu definieren, die Instanzen sind "eigentlich" das gleiche, wenn einige der Attribute sind unterschiedlich.Wie über das hinzufügen eines benutzerdefinierten Attributs zu Ihren Instanzen, wenn Sie zu erstellen, zB:
spam.myid=1
eggs.myid=2
Diese Weise an einem gewissen Punkt in Ihrem code, wenn
spamcopy1.seasoning=ketchup
undspamcopy2.seasoning=blackpepper
können Sie vergleichen Ihremyid
- Attribut, um zu sehen, ob Sie wirklich die "gleiche" spam.InformationsquelleAutor der Antwort Anentropic