Ví dụ tốt hơn một nghìn từ:Vấn đề Django QuerySet .defer() - lỗi hoặc tính năng?
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
Có hoạt động như mục đích này không?
Câu hỏi con: có cách nào đơn giản để lấy mẫu phiên bản thông thường từ phiên bản trả chậm không?
EDIT:
Dường như contenttypes khuôn khổ được vá một cách thích hợp: http://code.djangoproject.com/changeset/10523
vì vậy tôi sẽ nói rằng Model ._____ eq _____() điều hành không nên trông giống như this:
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
nhưng giống như sau:
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()
Điều này tất nhiên gây ra hai lần truy cập DB lần đầu tiên, nhưng may mắn thay get_for_model dường như triển khai bộ nhớ cache.
Trả lời cập nhật ... – FallenAngel
Chỉ trong trường hợp bất kỳ ai khác bị vấp phải bởi điều này, rõ ràng đây thực ra là lỗi Django cần được [cố định trong 1.7] (https://code.djangoproject.com/ticket/24772) –