我怎样才能正确地做这个复杂的Django查询集?



假设我有三个模型:

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

我想这就是你想要的。

相关内容

  • 没有找到相关文章

最新更新