2010-10-20 103 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

相關問題