为什么Django会为同一个查询提供不同的结果?

时间:2010-10-20 14:53:23

标签: django web-applications caching

对于模拟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个对象都是FooBarBazBlib,我会将限制设置为{ {1}},然后我会在第一次请求时获得0:2,并且当我第二次运行该方法时,该方法会返回[Foo, Bar]

有谁看到我在做错了什么?或者它是以某种方式影响我的方式的Django缓存?

1 个答案:

答案 0 :(得分:0)

我认为困难在于你使用一个集来存储你的对象,然后切片 - 并且集合没有排序(它们就像字典一样)。因此,查询结果实际上是不确定的。

有各种有序集的实现 - 您可以考虑使用其中一个。但是,我必须说,我认为你在Python中做了很多不必要且昂贵的独特ifying和排序,而大部分可以直接由数据库完成。例如,您似乎正在尝试获取与您传递的类别相关的唯一Metas列表。好吧,这可以在一个ORM查询中完成:

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

然后您可以删除设置,循环和排序命令。