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子句的重复项?
我最终所做的基本上就是随之计数,然后除以代码。
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)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |