如何注释查询集添加按字段分组的行号?

Dan*_*any 1 django orm

我有两个模型:

范本[id 书名、author_id]

模型作者[id, 姓名]

我需要查询按作者姓名和书名排序的书籍:

result = Books.order_by('author__name', 'title').value_list('author__name', 'title')
Run Code Online (Sandbox Code Playgroud)

但我还需要在每一行添加一个计数器,该计数器将随着每个新作者的出现而重置。

查询的结果应该是:

title      name                  position
-----------------------------------------
book1      Dan Brown             1
book2      Douglas Adams         1
book3      Douglas Adams         2
book4      Douglas Adams         3
book5      Douglas Adams         4
book6      Ernest Hemingway      1
book7      Ernest Hemingway      2
book8      Ernest Hemingway      3
book9      John Steinbeck        1
book10     John Steinbeck        2
Run Code Online (Sandbox Code Playgroud)

是否可以position使用 Django ORM 来实现该字段?

Lot*_*ram 5

看看这个答案

对于你的情况,我认为这应该有效

from django.db.models.expressions import Window
from django.db.models.functions import RowNumber
from django.db.models import F

result = (
    Books.order_by("author__name", "title")
    .annotate(
        row_number=Window(
            expression=RowNumber(), partition_by=[F("author")], order_by=[F("title")]
        )
    )
    .value_list("author__name", "title", "row_number")
)

Run Code Online (Sandbox Code Playgroud)