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_count"数量的问题,这些问题将转换为JSON并返回给发出GET请求的人。

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

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

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

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

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)

最新更新