首页 > 解决方案 > Django 模型查询设置为列表,然后将该列表用于另一个模型的排除查询

问题描述

    questions = Question.objects.filter(category=category)
    seen_questions_query = SeenQuestions.objects.filter(worker=user_id).only('question_id')
    seen_questions_list = list(seen_questions_query)
    questions_list = list(questions.exclude(id__in=seen_questions_list).values())
    random_sample = random.sample(questions_list, question_count)

我上面的这段代码不起作用。我对良好的 Django 实践比让它工作更感兴趣。

目标是获取“user_id”并查询他们在“SeenQuestions”模型中看到的问题,然后将其转换为一个列表,该列表将用于查询“Question”模型中没有的所有问题列表中的主键。然后我将其转换为一个列表并随机抽取“question_count”数量的问题,这些问题会变成 JSON 并返回给发出 GET 请求的任何人。

我采用了上面的方法,但我觉得这不是 Django 的最佳实践,似乎有更好的方法,而不是将查询集转换为列表,然后在该列表上查询,然后再次转换为列表。

以上不起作用,因为它抱怨将“seen_questions_query”转换为第 3 行的列表。

标签: pythondjangoget

解决方案


您可以使用一个查询集来执行此操作。我认为您缺少related_name用法(请参阅文档),假设您没有设置任何内容,您应该SeeQuestions通过question_instance.seenquestions_set.

下面的代码应该可以解决问题:

seen_questions = SeenQuestion.objects.filter(worker=user_id)
questions = Question.objects.filter(category=category).exclude(seenquestions_set__in=seen_questions)

最后,要将数据转储为 JSON,您可以使用:

from django.core.serializers.json import DjangoJSONEncoder
from django.core.serializers import serialize
serialize('json', questions, cls=DjangoJSONEncoder)

推荐阅读