代码之家  ›  专栏  ›  技术社区  ›  philgiese

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

  •  0
  • philgiese  · 技术社区  · 14 年前

    对于一个模拟的web服务,我编写了一个小Django应用程序,它充当一个web API,我的android应用程序可以查询这个API。当我向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 我会将限制设置为 0:2 ,然后我会得到 [Foo, Bar] 对于第一个请求和完全相同的请求,方法将返回 [Baz, Blib] 当我第二次运行它时。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Daniel Roseman    14 年前

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

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

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

    然后可以删除集合、循环和排序命令。