使用Django ORM进行高级订购

2024-06-13 23:23:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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本书等

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

有什么办法可以做到这一点吗


Tags: name模型示例modelmodelsbookslengthmax
1条回答
网友
1楼 · 发布于 2024-06-13 23:23:58

您可以使用^{} subquery [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')

相关问题 更多 >