簡體   English   中英

如何進行具有多個過濾器的Django數據庫查詢?

[英]How do I make a Django database query that has multiple filters?

我有一個藝術家和繪畫數據庫,我想根據藝術家名稱和繪畫標題進行查詢。 標題位於json文件中(藝術家名稱來自ajax),因此我嘗試了循環。

def rest(request):

    data = json.loads(request.body)
    artistname = data['artiste']
    with open('/static/top_paintings.json', 'r') as fb:
        top_paintings_dict = json.load(fb)

    response_data = []

    for painting in top_paintings_dict[artist_name]:
        filterargs = {'artist__contains': artistname, 'title__contains': painting}  
        response_data.append(serializers.serialize('json', Art.objects.filter(**filterargs)))

    return HttpResponse(json.dumps(response_data), content_type="application/json")

它不會返回我需要的對象列表,而只是返回一些對任何人都沒有好處的難看的雙序列化json數據。

   ["[{\"fields\": {\"artist\": \"Leonardo da Vinci\", \"link\": \"https://trove2.storage.googleapis.com/leonardo-da-vinci/the-madonna-of-the-carnation.jpg\", \"title\": \"The Madonna of the Carnation\"}, \"model\": \"serve.art\", \"pk\": 63091}]",

這個處理程序可以工作並返回我為藝術家准備的每幅畫。

def rest(request):

    data = json.loads(request.body)
    artistname = data['artiste']
    response_data = serializers.serialize("json", Art.objects.filter(artist__contains=artistname))
    return HttpResponse(json.dumps(response_data), content_type="application/json")

我只需要按標題和藝術家過濾查詢。

in您的問題是您要兩次將數據serializers.serialize json.dumps一次使用serializers.serialize ,然后再次使用json.dumps

我不知道您的應用程序的細節,但是可以在Django中鏈接過濾器。 所以我將采用您的第二種方法,只是替換行

response_data = serializers.serialize("json", Art.objects.filter(artist__contains=artistname))

response_data = serializers.serialize("json", Art.objects.filter(artist__contains=artistname).filter(title__in=paintings))

查看queryset文檔

__contains進行繪畫標題搜索的最有效方法是對所有可能的繪畫名稱使用Q對象 orQ對象一起使用:

from operator import or_

def rest(request):

    data = json.loads(request.body)
    artistname = data['artiste']
    with open('/static/top_paintings.json', 'r') as fb:
        top_paintings_dict = json.load(fb)

    title_filters = reduce(or_, (Q(title__contains=painting) for painting in top_paintings_dict[artist_name]))
    paintings = Art.objects.filter(title_filters, artist__contains=artist_name)

這將為您提供繪畫查詢集。 我懷疑您的雙重序列化是不正確的,但在單一藝術家姓名的情況下,您似乎對此感到滿意,因此我將由您自己決定。

這里的reduce調用是建立|結果的方法| 將多個Q對象組合在一起operator.or_|的功能句柄。 ,然后使用生成器表達式為每個繪畫名稱創建一個Q對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM