-1

J'essaye d'écrire une requête en Python en utilisant le datastore L'API ne récupère pas plus de 5 noms d'élèves avec GPA supérieur et égal à 3,2 et l'année de naissance inférieure à 1998. Mais, il renvoie l'erreur: BadFilterError: invalid filter: Only one property per query may have inequality filters (<, >=, >, <=).. Cependant, j'utilise la méthode mentionnée dans la documentation: https://cloud.google.com/appengine/docs/standard/python/datastore/queryclass#Query_filter https://cloud.google.com/appengine/docs/standard/python/datastore/queriesBadFilterError: filtre invalide: Une seule propriété par requête peut avoir des filtres d'inégalité (<, > =,>, <=)

code:

from google.appengine.ext import db 
import datetime 
import webapp2 

class Student(db.Model): 
    first_name = db.StringProperty() 
    last_name = db.StringProperty() 
    gpa = db.FloatProperty() 
    birth_year = db.IntegerProperty() 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     student1 = Student(first_name = 'Alex' , last_name = 'Karev', gpa = 3.5 , birth_year = 1996) 
     student1.put() 
     student2 = Student(first_name = 'Susannah', last_name = 'Walpole',gpa = 3.45, birth_year = 1997) 
     student2.put() 

     self.response.write('<p>Student1 entity, key = %s</p>' 
          % student1.key()) 
     self.response.write('<p>Student2 entity, key = %s</p>' 
          % student2.key()) 

     q = db.Query(Student) 

     q = Student.all() 

     q.filter('gpa >', 3.2) 
     q.filter('birth_year <', 1998) 

     results = q.fetch(5) 
     self.response.write('<p>Executing the query with fetch()...</p>') 
     for e in results: 
      self.response.write('<p>Found result: Last Name=%s' 
           % (e.last_name)) 

app = webapp2.WSGIApplication([('/', MainPage)], debug=True) 

Et, quand je me sers GQL au lieu de datastore API, je reçois la même erreur. code:

q = Student.gql('WHERE gpa > 3.2 ' +'AND birth_year < 1998 ' +'ORDER BY gpa ASC, birth_year DESC') 
+0

double possible de [Filtre invalide: Une seule propriété par requête peut avoir des filtres d'inégalité (> =, <=, >, <)] (https://stackoverflow.com/questions/20568673/invalid-filter-only-one-property-per-query-may-have-inequality-filters) – mbrig

+0

Aussi: https://stackoverflow.com/questions/13391818/badfiltererror-invalid-filter-only-one-property-per-query-may-have-inequality?rq=1 – mbrig

+0

Oui, mais mon modèle est différent, et je les ai essayé et ça ne marche pas. – Beginner

Répondre

0
q.filter('gpa >', 3.2) 
q.filter('birth_year <', 1998) 

Ce n'est pas une requête datastore valide parce qu'il a plus d'un filtres d'inégalité, et renvoie l'erreur: BadFilterError: invalid filter: Only one property per query may have inequality filters (<, >=, >, <=).. Les résultats de la requête doivent tous apparaître sur des lignes consécutives dans l'index et il n'y a index possible qui pourrait satisfaire complètement cette requête en utilisant des lignes consécutives. Donc, je résolu ce problème en utilisant uniquement q.filter('gpa >', 3.2) et la suppression q.filter('birth_year <', 1998), et en utilisant une instruction if pour filtrer Annee_Naiss dans le pour un look qui imprime la sortie:

self.response.write('<p>Executing the query with fetch()...</p>') 
    count = 0 
    for e in q: 
     if e.birth_year < 1998: 
      self.response.write('<p>Found result: Last Name=%s' 
          % (e.last_name)) 
      count += 1 
     if count > 4: 
      break 
0

Vous ne pouvez pas utiliser plus d'une variable avec des filtres d'inégalité à l'aide du datastore. Si vous en avez vraiment besoin, vous pouvez filtrer en utilisant l'heure de début seulement, tout en obtenant des résultats assez précis.

calitem = self.appointments.filter("begin >= ", start).filter("begin <= ", end).fetch(limit=10) 
+0

Je ne comprends pas. Il n'y a pas de propriété appelée "commencer". Merci – Beginner