2010-10-20 5 views
0

Pour un service web fictif, j'ai écrit une petite application Django, qui sert d'API web, que mon application Android interroge. Lorsque je fais des requêtes à l'API, je peux aussi transmettre un offset et une limite pour avoir seulement les données réellement nécessaires. Quoi qu'il en soit, j'ai rencontré le problème, que Django me donne des résultats différents pour la même requête à l'API. Il semble que les résultats sont retournés round robin.Pourquoi Django me donne-t-il des résultats différents pour la même requête?

Ce code Django qui sera exécuté:

def getMetaForCategory(request, offset, limit): 
    if request.method == "GET": 
     result = { "meta_information": [] } 

     categoryIDs = request.GET.getlist("category_ids[]") 

     categorySet = set(toInt(categoryIDs)) 
     categories = Category.objects.filter(id__in = categoryIDs) 

     metaSet = set([]) 

     for category in categories: 
      metaSet = metaSet | set(category.meta_information.all()) 

     metaList = list(metaSet) 
     metaList.sort() 

     for meta in metaList[int(offset):int(limit)]: 
      relatedCategoryIDs = getIDs(meta.category_set.all()) 

      item = { 
       "_id": meta.id, 
       "name": meta.name, 
       "type": meta.type, 
       "categories": list(categorySet & set(relatedCategoryIDs)) 
      } 

      result['meta_information'].append(item) 

     return HttpResponse(content = simplejson.dumps(result), mimetype = "application/json") 
    else: 
     return HttpResponse(status = 403) 

Qu'est-ce qui se passe est la suivante: Si tous les objets MetaInformation seraient Foo, Bar, Baz et Blib et je fixer la limite à 0:2, puis J'obtiendrais [Foo, Bar] avec la première demande et avec la même demande exactement la méthode retournerait [Baz, Blib] quand je l'exécuterais pour la deuxième fois.

Est-ce que quelqu'un voit ce que je fais mal ici? Ou est-ce le cache de Django qui m'empêche de faire quelque chose?

+0

Pourriez-vous d'abord résoudre votre problème? Vous avez une question sur les requêtes. essayez d'éliminer le reste de la logique de vue. Sur une note de côté: le require_GET est grand (trouvé dans django.views.decorators.http) – tback

+0

Le problème de base est, que j'obtiens des résultats différents sur la même requête. Mais comme Daniel a dit que c'est probablement dû à mon utilisation des ensembles. Avec ce long post, je voulais juste donner autant d'informations générales que possible. – philgiese

Répondre

0

Je pense que la difficulté est que vous utilisez un ensemble pour stocker vos objets, et trancher cela - et les ensembles n'ont pas d'ordre (ils sont comme des dictionnaires de cette façon). Ainsi, les résultats de votre requête sont en fait indéterminés.

Il existe différentes implémentations d'ensembles ordonnés - vous pourriez envisager d'en utiliser une. Cependant, je dois dire que je pense que vous faites beaucoup de tri et de tri uniques et superflus en Python, quand la plupart de ceci pourrait être fait directement par la base de données. Par exemple, vous semblez essayer d'obtenir la liste unique des métas qui sont liés aux catégories que vous passez. Eh bien, cela pourrait se faire en une seule requête ORM:

meta_list = MetaInformation.objects.filter(category__id__in=categoryIDs) 

et vous pouvez alors déposer l'ensemble, en boucle et les commandes de tri.

+0

Ah chose cool. Tout le temps j'ai pensé, que vous avez réellement besoin d'une variable dans le modèle appelé catégorie pour faire quelque chose comme ça. Bon à savoir. Mais la chose est, qu'avec cette requête, je reçois une liste avec deux éléments égaux. – philgiese

+0

Ah ok, ajouté distinct() et maintenant tout va bien! Merci encore. – philgiese

Questions connexes