如何注释 QuerySet 添加按字段分组的行号?
How to annotate a QuerySet adding row numbers groupped by a field?
我有两个模型:
型号书籍[id, title,author_id]
型号作者[id,姓名]
我需要查询按作者姓名和书名排序的图书:
result = Books.order_by('author__name', 'title').value_list('author__name', 'title')
但我还需要为每行添加一个计数器,每个新作者都会重置该计数器。
查询结果应该是:
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
是否可以使用 Django ORM 实现此 position
字段?
看看
对于你的情况,我认为这应该可行
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")
)
我有两个模型:
型号书籍[id, title,author_id]
型号作者[id,姓名]
我需要查询按作者姓名和书名排序的图书:
result = Books.order_by('author__name', 'title').value_list('author__name', 'title')
但我还需要为每行添加一个计数器,每个新作者都会重置该计数器。
查询结果应该是:
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
是否可以使用 Django ORM 实现此 position
字段?
看看
对于你的情况,我认为这应该可行
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")
)