Пример лучше тысячи слов:
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
Это нарочно так работает?
Подзапрос: есть ли простой способ получить обычный экземпляр модели из отложенного?
EDIT:
Похоже, что фреймворк Contenttypes исправлен соответствующим образом:
http://code.djangoproject.com/changeset/10523
поэтому я бы сказал, что оператор Model ._____ eq _____ () не должен выглядеть так: this :
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
но больше похоже на это:
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()
Это, конечно, в первый раз вызывает два обращения к БД, но, к счастью, похоже, get_for_model реализует кеш.