使用 django ORM 进行高级排序
Advanced ordering with 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
subquery [Django-doc]:
from django.db.models import Exists, OuterRef
has_book = Book.objects.filter(
<b>publisher_id=OuterRef('pk')</b>
)
Publisher.objects.annotate(
<b>nb_books=Exists(has_book)</b>
).order_by('-nb_books', 'name')
搭配如下模型(为便于说明,仅为举例)
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
subquery [Django-doc]:
from django.db.models import Exists, OuterRef
has_book = Book.objects.filter(
<b>publisher_id=OuterRef('pk')</b>
)
Publisher.objects.annotate(
<b>nb_books=Exists(has_book)</b>
).order_by('-nb_books', 'name')