我遇到了新问题
我们说我有以下3种型号:
class Author(models.Model):
name = models.TextField()
class Book(models.Model):
author = models.ForeignKey(Author, related_name='books')
title = models.TextField()
is_fiction = models.BooleanField()
class SpeakingEvent(models.Model):
author = models.ForeignKey(Author, related_name='events')
date = models.DateField()
我希望获得一个单独的作者查询集,其中注释了已发布的小说书的数量以及未来演讲事件的数量。
所以,我可以做到以下几点:
Author.objects.all().annotate(
future_speaking=Sum(Case(
When(events__date__gte=timezone.now(),
then=1),
default=0)),
fiction_count=Sum(Case(
When(books__is_fiction=True,
then=1),
default=0)),
)
但是,结果数字太高了。如果有m本书和n个活动,那么我们最终会得到<correct_result> * m
的事件计数,<correct_result> * n
用于计算帐号。这是由于django与左连接一起连接两个表的方式引起的。如果我遗漏任何一个注释,结果都是正确的。
有没有办法改变连接是用if子句删除重复项?
答案 0 :(得分:1)
我最终做的是基本上与它一起计算,然后划分代码。
Author.objects.all().annotate(
future_speaking_divide_count=Count('events'),
future_speaking=Sum(Case(
When(events__date__gte=timezone.now(),
then=1),
default=0)),
fiction_count=Sum(Case(
When(books__is_fiction=True,
then=1),
default=0)),
fiction_count=Count('books')
)