【发布时间】:2011-04-06 18:47:06
【问题描述】:
一个例子胜过千言万语:
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_____() 运算符不应该看起来像 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()
这当然是第一次导致两次DB命中,不过好在get_for_model似乎实现了缓存。
【问题讨论】:
-
以防万一其他人被此绊倒,显然这实际上是一个 Django 错误,应该是 fixed in 1.7
标签: python django orm django-models