Ein Beispiel ist besser als tausend Worte:Django QuerySet .defer() Problem - Fehler oder Funktion?
In [3]: User.objects.filter(id=19)[0] == User.objects.filter(id=19)[0]
Out[3]: True
In [4]: User.objects.filter(id=19)[0] == User.objects.filter(id=19).defer('email')[0]
Out[4]: False
Ist es so absichtlich arbeiten?
Teilfrage: Gibt es eine einfache Möglichkeit, eine reguläre Modellinstanz von der zurückgestellten zu erhalten?
EDIT:
Es ist wie Content aussieht Rahmen entsprechend gepatcht: http://code.djangoproject.com/changeset/10523
so würde ich sagen, dass das Modell ._____ eq _____() Operator nicht wie this aussehen sollte:
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
aber mehr wie folgt:
def __eq__(self, other):
return ContentType.objects.get_for_model(self) is ContentType.objects.get_for_model(other) and self._get_pk_val() == other._get_pk_val()
Dies verursacht natürlich zum ersten Mal zwei DB-Treffer, aber glücklicherweise scheint get_for_model Cache zu implementieren.
Antwort aktualisiert ... – FallenAngel
Nur für den Fall, dass irgendjemand anderes davon stolpern sollte, anscheinend war das in der Tat ein Django-Bug, der in [1.7] behoben werden sollte (https://code.djangoproject.com/ticket/24772)) –