如何生成具有多个过滤器的Django数据库查询?

2024-06-07 07:07:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个艺术家和绘画的数据库,我想根据艺术家姓名和绘画标题进行查询。标题在一个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那样为一些难看的对象返回一个好的json列表。在

^{pr2}$

每一个艺术家都有一个作品。在

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")

我只需要按标题和艺术家过滤我的查询。在


Tags: restjson标题dataartistresponserequesttop
2条回答

对绘画标题进行__contains搜索的最有效方法是使用^{} objects到{}所有可能的绘画名称:

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对象。在

您的问题是,您将数据序列化为json两次—一次是使用serializers.serialize,另一次是使用json.dumps。在

我不知道您的应用程序的具体细节,但可以在django中链接过滤器。所以我同意你的第二种方法,把线换掉

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

^{pr2}$

检查queryset documentation。在

相关问题 更多 >