2010-10-20 101 views
0

对于模拟Web服务,我编写了一个小Django应用程序,它用作我的Android应用程序查询的Web API。当我向API发出请求时,我也能够交付一个偏移量和限制以仅传输真正必要的数据。无论如何,我遇到了这个问题,Django给了我不同的API查询结果。看起来好像结果是循环赛结果。为什么Django为同一个查询提供了不同的结果?

这是将要运行的Django代码:

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) 

会发生什么情况是这样的:如果所有MetaInformation对象将是FooBarBazBlib,我会的限制设置为0:2,然后我会得到[Foo, Bar]与第一个请求和完全相同的请求时,方法将返回[Baz, Blib]当我第二次运行它。

有没有人看到我在做什么错在这里?还是Django缓存以某种方式进入我的方式?

+0

你可以尝试将问题降低到核心吗?您对查询有疑问。尝试消除其余的视图逻辑。 附注:require_GET很棒(在django.views.decorators.http中找到) – tback 2010-10-20 15:16:25

+0

核心问题是,我在同一个查询中得到不同的结果。但正如丹尼尔所说,这可能是由于我使用套件。有了这篇长文章,我只想尽可能多地提供背景信息。 – philgiese 2010-10-20 15:44:48

回答

0

我觉得困难在于你正在使用一个集合来存储你的对象,并且对它进行切片 - 并且集合没有排序(它们就像这样的字典)。所以,你的查询结果实际上是不确定的。

有各种各样的有序集的实现 - 你可以看看使用其中之一。但是,我必须说,我认为你正在做很多不必要的和昂贵的独特操作,并且在Python中进行排序和排序,当时大多数操作都可以直接由数据库完成。例如,你似乎试图获得与你传递的类别相关的Metas的唯一列表。那么,这可能会在一个ORM查询来完成:

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

,然后你可以降低到设定,循环和排序命令。

+0

很酷的事情。我一直认为,你实际上需要一个名为category的模型中的变量来做这样的事情。很高兴知道。但问题是,通过这个查询,我得到了一个包含两个相等元素的列表。 – philgiese 2010-10-20 15:43:38

+0

好吧,添加不同的(),现在一切都很好!再次感谢。 – philgiese 2010-10-20 16:00:55

相关问题