假设我有三个模型:
class Author(models.Model):
name = models.CharField(max_length=64)
class Book(models.Model):
author = models.ForeignKey(
Author,
blank=True,
null=True,
on_delete=models.SET_NULL
)
name = models.CharField(max_length=64)
class Store(models.Model):
books = models.ManyToManyField(Book)
name = models.CharField(max_length=64)
我不知道有些书的作者是谁。在这些情况下,作者为空。
当我查询Store时,我想知道每个Store有多少本书并对它们进行排序。我的查询集是这样的:
Store.objects.all().annotate(books_count=Count('books')).order_by('-books_count')
现在,如果我只想计数有作者的书呢?
我尝试了这个查询集,但它显然是不正确的:
filter = Q(books__author__isnull=False)
Store.objects.annotate(books_count=Count(filter)).all().order_by('-books_count')
有人知道正确的方法来做这个查询吗?
我相信下面的查询是您正在寻找的。
books_count = (
Book.objects.filter(
store=OuterRef("pk"),
author__isnull=False,
)
.annotate(count=Func(F("id"), function="COUNT"))
.values("count")
)
Store.objects.annotate(count=Subquery(books_count)).order_by("-count")
你可以反过来做:
Book.objects.filter(author__isnull=False).values('store_set').annotate(count=Count('store_set')).order_by('-count')
我将采取一点大胆的猜测,但我认为你的Q
对象的使用可能是不正确的Count
内部。
Count
期望一个类似对象的表达式,这可能是一个字符串,F, OuterRef, SubQuery等。
Store.objects.filter(filter).annotate(
books_count=Count("books")
).order_by('-books_count')
我想这就是你想要的。