2015-12-19 35 views
1

我想篩選我的結果以僅顯示第一個「變體」類指向「Product」類。Django Rest-篩選結果以顯示第一個變體

我幾乎希望它像這樣工作:

'product__variation__image__image'[0], 

OR

'product_set__variation__image__image'[0], 

我試着使用:

.distinct('product_pk') 

但是,如果我用.order_by這是行不通的()

Th e下面的代碼起作用,但每個項目都會重複幾次,因爲它有與之相關的變化。

這裏是我的Django的休息視圖的片段:在查詢集)

wardrobematch = { 
    'user': lambda x: ('user__pk', x) 
} 

class WardrobeListView(APIView): 

    renderer_classes = (JSONRenderer,) 

    def get(self, request, *args, **kwargs): 

     filters = {} 
     for key, value in request.GET.items(): 
      key = key.lower() 
      if key in wardrobematch: 
       lookup, val = wardrobematch[key](value.lower()) 
       filters[lookup] = val 

    qset = (
     Analytic.objects 
     .filter(like=True,**filters) 
     # .distinct('product_id',) 
     .values('product_id', 'product__name', 'product__brand', 'product__store__store_name', 'product__variation__image__image', 'product__variation__price__price', 'updated',) 

    ) 

    result = sorted(qset, key=lambda obj: obj.updated) 
    return Response(serializers.serialize("json", result)) 
+0

你是否在使用sqlite?它不支持「DISTINCT」。要使「DISTINCT」語句正常工作,請切換到MySQL或PostgreSQL。 – RodrigoDela

+0

在PostgreSQL上。剛剛更新的問題 - 可以使用.distinct工作,但是這打破了「order_by」。我需要使用兩者。這是回溯http://dpaste.com/1G7F8YC – Ycon

+0

你的回溯表明你的'distinct()'應該和你的'order_by()'相匹配。你有沒有試過把'product_pk'放到你的'order_by()'中? – RodrigoDela

回答

0

當您指定字段名稱,則必須提供ORDER_BY(和在ORDER_BY()字段必須與啓動distinct()中的字段,順序相同。

摘自:Django's documentation

無論如何你都可以對它進行排序。

qs = Analytic.objects.filter(like=True,**filters) 
     .distinct('product_pk',) 
     .values('product_pk', 'product__name', 'product__brand', 'product__store__store_name', 'product__variation__image__image', 'product__variation__price__price', 'updated') 
result = sorted(qs, key=lambda obj: obj['updated']) 
return Response(json.dumps({'result': result})) 
+0

謝謝。你的例子說'字典'對象沒有'更新'的屬性。分析類中的'已更新',因此不確定爲什麼找不到它。我更新了我的上面的代碼,以顯示我嘗試過的內容。 – Ycon

+0

您沒有更新這些值。看看這些值,我的例子中的最後一個是'updated'。 – RodrigoDela

+0

這給了我一個斷言錯誤(預期'Response,'HttpResponse'或'HttpStreamingResponse'從視圖返回,但收到'')。我已經使用 – Ycon