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

时间:2015-08-06 12:16:07

标签: 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()

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

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

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子句删除重复项?

1 个答案:

答案 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')
)