使用Django 1.8 ORM跨多个表的注释

Jef*_*ffS 5 django postgresql django-orm django-1.8

我遇到了新的问题

假设我有以下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()
Run Code Online (Sandbox Code Playgroud)

我希望得到一个单独的作者查询集,其中注释了已发布的小说书的数量以及未来演讲事件的数量.

所以,我可以做到以下几点:

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)),
)
Run Code Online (Sandbox Code Playgroud)

但是,结果数字太高.如果有m本书和n个事件,那么我们最终会<correct_result> * m计算事件<correct_result> * n数量.这是由于django与左连接一起连接两个表的方式引起的.如果我省略任何一个注释,结果都是正确的.

有没有办法更改连接是删除带有when子句的重复项?

Jef*_*ffS 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')
)
Run Code Online (Sandbox Code Playgroud)