django 按prefetch_related查询中的第一个对象对QuerySet进行排序

ovfsdjhp  于 2023-04-22  发布在  Go
关注(0)|答案(1)|浏览(130)

如果我有以下模型,描述可以有几个不同标题的书籍:

class Book(models.Model):
    publisher = models.CharField(max_length=255)

class BookTitle(models.Model):
    work = models.ForeignKey(Book, related_name="titles", on_delete=models.CASCADE)
    title = models.CharField(max_length=255)

我正在获取一个QuerySet of Books,预获取它们的BookTitles,像这样:

from django.db.models import Prefetch

books = Book.objects.prefetch_related(
    Prefetch(
        "titles",
        queryset=BookTitle.objects.all()
    )
)

我希望能够按BookTitles中的第一个排序QuerySet。如何执行此操作?
(This是我的实际代码的一个非常简化的示例,用于解释基本问题。)

yacmzcpb

yacmzcpb1#

如果我没有理解错的话,您希望按每本书的第一个书名排序所有书籍。您可以通过将第一个书名注解到查询中,然后按该书名排序来实现:

from django.db.models import Prefetch, OuterRef, Subquery

first_book = BookTitle.objects.filter(work=OuterRef("pk")).order_by("title")

Book.objects.annotate(
    first_book_name=Subquery(first_book.values("title")[:1])
).prefetch_related(Prefetch("titles", queryset=BookTitle.objects.all())).order_by(
    "first_book_name"
)

相关问题