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