![](/img/trans.png)
[英]How do I make a query where it filters everything that starts with a number in 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
對象 or
將Q
對象一起使用:
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.