django ORM的高级排序



使用下面的模型(为了便于解释,这只是一个示例)

class Publisher(models.Model):
name = models.CharField(max_length=300)
class Book(models.Model):
name = models.CharField(max_length=300)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='books')

我想列出所有出版商,并按"他们是否至少出版了一本书"排序。然后根据他们的名字

我最接近的是下面的请求

Publisher.objects.all().annotate(nb_books=Count('books')).order_by('-nb_books', 'name').distinct()

不幸的是,这并不是我所需要的,因为它将显示所有出版5本书的出版商,然后是所有出版4本书的出版商,然后是所有出版3本书的出版商,等等。

我需要的是所有至少有的出版商一本书在一个集团出版然后那些没有任何

我能做到吗?

您可以使用Exists子查询(Django-doc):

from django.db.models import Exists, OuterRef
has_book = Book.objects.filter(
publisher_id=OuterRef('pk')
)
Publisher.objects.annotate(
nb_books=Exists(has_book)
).order_by('-nb_books', 'name')

相关内容

  • 没有找到相关文章

最新更新