Un exemple vaut mieux que mille mots:Django QuerySet .defer() problème - bug ou fonctionnalité?
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
-t-il fonctionner comme ça sur le but?
Sous-question: existe-t-il un moyen simple d'obtenir une instance de modèle régulière à partir de celle différée?
EDIT:
Il ressemble cadre contenttypes est patché appropriée: http://code.djangoproject.com/changeset/10523
Je dirais donc que le modèle ._____ équivalent opérateur _____() ne doit pas ressembler à this:
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
mais plus comme ceci:
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()
Cela provoque bien sûr deux hits DB pour la première fois, mais heureusement, get_for_model semble implémenter le cache.
Réponse mise à jour ... – FallenAngel
Juste au cas où quelqu'un d'autre se fait trébucher par cela, apparemment c'était en fait un bug Django qui devrait être [fixé dans 1.7] (https://code.djangoproject.com/ticket/24772 –