Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何生成具有多个筛选器的Django数据库查询?_Python_Json_Django_Http - Fatal编程技术网

Python 如何生成具有多个筛选器的Django数据库查询?

Python 如何生成具有多个筛选器的Django数据库查询?,python,json,django,http,Python,Json,Django,Http,我有一个艺术家和绘画的数据库,我想根据艺术家姓名和绘画标题进行查询。标题在一个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.

我有一个艺术家和绘画的数据库,我想根据艺术家姓名和绘画标题进行查询。标题在一个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")

我只需要按标题和艺术家筛选查询。

在您的问题中,您将数据序列化为json两次—一次使用Serializer.serialize,然后再次使用json.dumps

我不知道您的应用程序的细节,但可以在django中使用链式过滤器。所以我会采用你的第二种方法,只是更换线路

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


检查中的。

您的问题是将数据序列化为json两次-一次使用serializers.serialize,然后再次使用json.dumps

我不知道您的应用程序的细节,但可以在django中使用链式过滤器。所以我会采用你的第二种方法,只是更换线路

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


检查。

对于绘画标题的“包含”搜索,最有效的方法是使用或同时使用所有可能的绘画名称:

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组合在一起的结果的一种方法。或者u是|的函数句柄,然后,我使用生成器表达式为每个绘画名称创建一个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对象。

您正在构建一个序列化的Python列表,然后序列化该列表。您希望json是一个序列化对象列表,还是一个对象列表?我想要一个对象列表。我无法使用Art.objects.filter查询一个艺术家姓名和绘画标题列表,但这正是我需要的。一个艺术家,多幅绘画。你正在构建一个Python序列化列表,然后序列化该列表。您希望json是一个序列化对象列表,还是一个对象列表?我想要一个对象列表。我无法使用Art.objects.filter查询一个艺术家姓名和绘画标题列表,但这正是我需要的。一个艺术家,多幅画。我有多个头衔,而不仅仅是一个头衔。您的代码将只返回一个对象。我已经试着制作一个序列化对象的列表,但它没有给我任何有用的东西。这对精确的标题匹配很有用-如果你需要在绘画标题上包含,我想我的答案更接近。但如果你想要确切的标题匹配,这一个更好。我有多个标题,而不仅仅是一个标题。您的代码将只返回一个对象。我已经试着制作一个序列化对象的列表,但它没有给我任何有用的东西。这对精确的标题匹配很有用-如果你需要在绘画标题上包含,我想我的答案更接近。但是,如果你想要的是精确的标题匹配,这个更可取。我不再重复序列化它。你的答案包含一些我需要学习的高级方法。Q对象值得学习。您可以跳过reduce和operator.or u,如果您不确定它们,只需使用title_filters=Qtitle_uucontains=top_paints_dict[artist_name][0];对于在顶级画作中的绘画,请参见[Artister_name][1:]:title_filters=title_filters | Qtitle____包含=绘画我不再对其进行双重序列化。您的答案包含一些我需要学习的高级方法。Q对象值得学习。您可以跳过reduce和operator.or u,如果您不确定它们,只需使用title_filters=Qtitle_uucontains=top_paints_dict[artist_name][0];对于顶级画作中的绘画[Artister_name][1:]:title_filters=title_filters | Qtitle__包含=绘画