gpt4 book ai didi

python - 如何在查询集中创建具有过滤值的另一列

转载 作者:行者123 更新时间:2023-12-01 08:43:28 24 4
gpt4 key购买 nike

我有一个检索 20 个问题的查询。然后,查询应该向查询集中添加另一列或数据,以指示用户回答了哪个选择。所以总共有 4 个模型,包括 User 模型。

class Question(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(max_length=200)
total_votes = models.IntegerField(default=0)

class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.CharField(max_length=120)
vote_count = models.IntegerField(default=0)

class Voting(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
choice = models.ForeignKey(Choice, on_delete=models.CASCADE)

查询

Question.objects.filter(
Q(user=3))[:20]

当我这样做时,它不起作用:

Question.objects.filter(Q(user=1)).annotate(which_answer= filter(choice__question=3, user=1))[:20]

我得到TypeError:filter()不接受关键字参数

如何在此查询中添加另一列以显示用户选择的选项?

最佳答案

注释需要看起来像这样(如果用户 id = 1):

choice_query = Subquery(Choice.objects.filter(question=OuterRef('pk')).values('choice')[:1], output_field=models.CharField())

Question.objects.filter(user=1).annotate(which_answer=choice_query)[:20]

您编写一个子查询,根据正在注释的问题和用户来过滤选择对象,仅选择 1(假设只有 1)并将该选择值输出到 char 字段,然后用该注释子查询。

只是一个旁注:这里似乎不需要 Q 表达式。

不确定您在这里的用例到底是什么,但如果您使用序列化器并且只需向主查询添加一个选择相关子句并且不关心注释,您也可能会看到更多的运气或更好的性能.

编辑:经过讨论,我相信你真正想要的是用户的投票,它指向他们的选择。它看起来像这样(同样用户 id = 1):

vote_query = Subquery(Vote.objects.filter(question=OuterRef('pk'), user=1).values('choice')[:1], output_field=models.IntegerField())

Question.objects.filter(user=1).annotate(which_answer=vote_query)[:20]

此查询会将用户所选选项的 ID 输出到which_answer 注释。

关于python - 如何在查询集中创建具有过滤值的另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com