2010-08-25 4 views
2

J'ai un modèle avec une propriété de référence, par exemple:Interrogation pour ne pas Aucun

class Data(db.Model): 
    x = db.IntegerProperty() 

class Details(db.Model): 
    data = db.ReferenceProperty(reference_class = Data) 

La référence de données peut être Aucun.

Je souhaite récupérer toutes les entités Details qui ont des données valides, c'est-à-dire pour lesquelles la propriété de référence n'est pas None.

Les travaux suivants:

Details.all().filter('data !=', None).fetch(1000) 

Cependant, selon la documentation on queries, une requête != sera effectivement effectuer deux requêtes, ce qui semble inutile dans ce cas. != est-il optimisé pour n'effectuer qu'une seule requête lorsqu'il est utilisé avec None?

Alternativement, this post mentionne que NULL trie toujours avant les valeurs valides. Par conséquent, le suivant apparaît également au travail:

Details.all().filter('data >', None).fetch(1000) 

Bien que cela ne ferait que faire une requête, en utilisant > au lieu de != fait l'objet de ce qu'il fait moins évident.

En tant que troisième option, je pourrais ajouter un champ supplémentaire au modèle:

class Details(db.Model): 
    data = db.ReferenceProperty(reference_class = Data) 
    has_data = db.BooleanProperty() 

Tant que je continue à has_data synchronisées avec les données, je pouvais faire:

Details.all().filter('has_data =', True).fetch(1000) 

Quel chemin serait être le meilleur?

Merci.

Répondre

3

Je vous conseille d'utiliser le champ modèle supplémentaire. Ceci est plus flexible, car il vous permet également d'interroger les détails qui n'ont pas de références de données. De plus, les requêtes ne peuvent avoir qu'un seul filtre d'inégalité, il est donc préférable de sauvegarder ce filtre d'inégalité pour une autre propriété où l'inégalité a plus de sens, comme les propriétés d'entier.

Pour vous assurer que le drapeau est toujours mis à jour, vous pouvez ajouter une fonction de commodité aux détails, comme ceci:

class Details(db.Model): 
    data = db.ReferenceProperty(reference_class=Data) 
    has_data = db.BooleanProperty(default=False) 

    def add_data(self, data): 
     """ Adds data""" 
     if not data: return 
     self.has_data = True 
     self.data = data 
     return self.put() 
+0

triples guillemets, quadrupler citations :) –

+0

Oops. Merci, Tim. Édité. – mahmoud

+0

Re "Ceci est plus flexible, car il vous permet également d'interroger les détails qui n'ont pas de références de données" - il est réellement possible d'utiliser 'Details.all(). Filter ('data =', None) .fetch (1000) 'pour le faire. Cependant, je n'avais pas considéré l'angle de sauvegarde du filtre d'inégalité pour autre chose si j'en avais besoin dans le futur - bon point. Merci. –

Questions connexes