对于模拟Web服务,我写了一个小的Django应用程序,它作为一个Web API,我的android应用程序查询。当我向API发出请求时,我也能够移交偏移量并限制为只传输真正必要的数据。无论如何,我遇到了问题,Django为API提供了相同查询的不同结果。似乎结果是循环返回的。
这是将运行的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
个对象都是Foo
,Bar
,Baz
和Blib
,我会将限制设置为{ {1}},然后我会在第一次请求时获得0:2
,并且当我第二次运行该方法时,该方法会返回[Foo, Bar]
。
有谁看到我在做错了什么?或者它是以某种方式影响我的方式的Django缓存?
答案 0 :(得分:0)
我认为困难在于你使用一个集来存储你的对象,然后切片 - 并且集合没有排序(它们就像字典一样)。因此,查询结果实际上是不确定的。
有各种有序集的实现 - 您可以考虑使用其中一个。但是,我必须说,我认为你在Python中做了很多不必要且昂贵的独特ifying和排序,而大部分可以直接由数据库完成。例如,您似乎正在尝试获取与您传递的类别相关的唯一Metas列表。好吧,这可以在一个ORM查询中完成:
meta_list = MetaInformation.objects.filter(category__id__in=categoryIDs)
然后您可以删除设置,循环和排序命令。