2010-10-21 9 views
2

J'essaie de travailler avec un ensemble de modèles django dans un script externe. J'interroge la base de données à un intervalle prédéfini pour obtenir les éléments répondant à la requête. Quand mon script externe les traite, cela prend du temps et je peux obtenir les mêmes résultats dans la requête si le traitement n'a pas encore mis à jour le modèle. J'ai pensé que je pourrais utiliser un ensemble ou une liste pour stocker le traitement des éléments et vérifier chaque modèle à partir du résultat de la requête pour s'assurer qu'il n'est pas en cours de traitement. En essayant ceci cependant, il semble que le mot clé in renvoie toujours True. Des pensées?Jeu Python et le problème d'utilisation du mot clé "in"

(Python 2.6 sur ubuntu 10,10)

>>> t 
<SomeDjangoModel: Title1> 
>>> v 
<SomeDjangoModel: Title2> 
>>> x 
<SomeDjangoModel: Title3> 
>>> items 
set([<SomeDjangoModel: Title3>, <SomeDjangoModel: Title1>]) 
>>> t in items 
True 
>>> x in items 
True 
>>> v in items 
True 
>>> items 
set([<SomeDjangoModel: Title3>, <SomeDjangoModel: Title1>]) 
>>> 
+0

Est-ce que vos modèles diffèrent de façon perceptible? – SilentGhost

+0

Que rapporte 'v == t'? – katrielalex

+0

Ahh ... v == x renvoie vrai. Ils ont des propriétés différentes, mais sont en quelque sorte les mêmes. hmmmm. – RyanBrady

Répondre

2

Python sets exigent que les objets à mettre en œuvre de manière appropriée __eq__ et __hash__.

J'ai regardé django.db.models.base.Model (link) et vu qu'il définit ces méthodes en termes de de modèle PK:

def __eq__(self, other): 
     return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val() 

    def __ne__(self, other): 
     return not self.__eq__(other) 

    def __hash__(self): 
     return hash(self._get_pk_val()) 

Il est donc pas une surprise que les objets apparemment distincts sont considérés comme des « égaux », c'est parce que ils ont leurs PKs initialisés à une valeur par défaut (par exemple None).