gpt4 book ai didi

python - Django: NotImplementedError: annotate() + distinct(fields) 未实现

转载 作者:太空狗 更新时间:2023-10-29 17:48:51 29 4
gpt4 key购买 nike

有 2 个简单模型:

class Question(TimeStampedModel):
text = models.CharField(max_length=40)

class Answer(TimeStampedModel):
question = models.ForeignKey(Question, related_name='answers')
is_agreed = models.BooleanField()
author = models.ForeingKey(User, related_name='answers')

还有我的问题:

In [18]: Question.objects.count()
Out[18]: 3

我需要用“is_user_agreed”和“answers_amount”字段注释查询集:

In [18]: user = User.objects.first() 
In [19]: qs = Question.objects.annotate(
...: is_user_agreed=Case(
...: When(answers__in=user.answers.filter(is_agreed=True), then=Value(True)),
...: When(answers__in=user.answers.filter(is_agreed=False), then=Value(False)),
...: default=Value(None),
...: output_field=NullBooleanField(),
...: ),
...: ).annotate(answers_amount=Count('answers'))
...: qs.count()
Out[19]: 4

^ 这里计数是 4,但我在 db 中只有 3 个问题 :(所以,我试过 distinct()

In [20]: qs.distinct().count()
Out[20]: 4 # but distinct doesn't work

In [21]: qs.distinct('id').count()

在最后一行代码之后我得到了这个异常:

NotImplementedError: annotate() + distinct(fields) is not implemented.

我也尝试过使用这个技巧 annotate(Count('id')).filter(id__count__gt=1)

但在这种情况下,我将丢失所有重复的行,而 qs.count() 是 2。

更新:问题是查询集中的重复行。

解决方案:(Vladimir 第二种方法的扩展变体)

user = User.objects.first()
user_agreed_questions = user.answers.filter(
is_agreed=True).values_list('question_id', flat=True)

user_not_agreed_questions = user.answers.filter(
is_agreed=False).values_list('question_id', flat=True)

Question.objects.annotate(
answer_amount=Count('answers'),
is_user_agreed=Case(
When(id__in=user_agreed_questions, then=True),
When(id__in=user_not_agreed_questions, then=False),
default=None,
output_field=NullBooleanField(),
),
)

最佳答案

试试这个:

Question.objects.annotate(
answer_amount=Count('answers'),
is_user_agreed=F('answers__is_agreed'),
).order_by('id', '-answers__is_agreed').distinct('id')

如果question 没有answers,则question.is_user_agreedNone。如果 question 至少有一个 answeranswer.is_agreed=True,则 question.is_agreed。否则,is_user_agreedFalse

或者这个:

agreed_questons = Answer.objects.filter(
is_agreed=True,
).values_list('question_id', flat=True).distinct()

Question.objects.annotate(
answer_amount=Count('answers'),
is_agreed=Case(
When(id__in=agreed_questions, then=True),
When(answers__isnull=True, then=None),
default=False,
output_field=NullBooleanField(),
),
)

agreed_questonsquestionsid 列表,至少有一个 answer with answer .is_agreed=True.

关于python - Django: NotImplementedError: annotate() + distinct(fields) 未实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38583295/

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