python - 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 行的列表。
解决方案
您可以使用一个查询集来执行此操作。我认为您缺少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)
推荐阅读
- erlang - 使用erlang解析ejabberd数据包中的自定义元素
- python - 如何创建一个从其他模型中总结的模型,而不是保存到数据库中而是显示在管理页面中?
- postgresql - 具有无穷大的 Postgres WHERE 子句
- reactjs - 如何使用 reactjs 为 API 数据创建搜索栏?
- python - 在 python 中将 len() 和 sum() 存储为变量的约定
- react-hooks - 如何在`useLazyLoadQuery`中跳过请求
- c++ - 尝试使用 TransmitFile 发送大文件会导致错误代码 87(错误参数)
- pyspark - 在 PySpark 数据框中创建的二进制列不能用作过滤器?
- verilog - verilog $基于时间的时钟周期
- javascript - 尝试在 ChartsJS 中为饼图插入另一个标签