django - Django orm中的LEAD和LAG窗口功能,如何应用于单个对象?
问题描述
问题是关于Window
Django 中的函数使用。
我有以下模型:
class EntriesChangeLog(models.Model):
content_type = models.ForeignKey(
ContentType,
on_delete=models.CASCADE,
)
object_id = models.PositiveIntegerField(
)
content_object = GenericForeignKey(
'content_type',
'object_id',
)
user = models.ForeignKey(
get_user_model(),
verbose_name='user',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='access_logs',
)
access_time = models.DateTimeField(
verbose_name='access_time',
auto_now_add=True,
)
as_who = models.CharField(
verbose_name='Status of the accessed user.',
choices=UserStatusChoices.choices,
max_length=7,
)
operation_type = models.CharField(
verbose_name='Type of the access operation.',
choices=OperationTypeChoices.choices,
max_length=6,
)
state = JSONField(
verbose_name='Model state before save or delete.',
encoder=CustomEncoder,
)
我的目标是用相同的和在查询state
集中的上一个和下一个对象的字段来注释这个模型的查询集中的每个对象。这是稍后在详细视图中获取此注释并计算先前、当前和未来状态之间的差异所必需的。object_id
content_type_id
我在 get_object 中的查询集:
def get_queryset(self):
model = self.kwargs['model_name']
instance_pk = self.kwargs['instance_pk']
self.queryset = self.model.objects.filter(
object_id=instance_pk,
content_type__model=model.__name__.lower(),
content_type__app_label=model._meta.app_label.lower(),
).select_related('user', )
return super().get_queryset()
def get_object(self):
queryset = self.filter_queryset(self.get_queryset())
q = queryset.annotate(
next_val=Window(
expression=Lead('state'),
order_by=F('id').asc()
),
prev_val=Window(
expression=Lag('state'),
order_by=F('id').asc(),
),
)
obj = q.filter(pk=self.kwargs['pk']).first()
self.check_object_permissions(self.request, obj)
return obj
RAWSQL 中的类比
SELECT
id,
state,
LEAD("state") OVER(ORDER BY "id" ) AS "next_val",
LAG("state") OVER(ORDER BY "id") AS "prev_val"
FROM "administration_entrieschangelog"
where object_id =158 and content_type_id=7
当查询集中有多个对象时,它工作正常,即在 ListView 中。但在详细视图中,它似乎WHERE
以前有效,SELECT
并且两个注释都返回NULL
。看起来WINDOW
查询集中的那个函数只有一个对象,它只受这个对象的限制,LEAD
并且LAG
看不到它的邻居。
问题是——是否有可能以某种方式为单个对象添加这两个注释?
解决方案
推荐阅读
- algorithm - 如何在有向图中找到彼此距离 k 的所有节点(探索图中的每条边)?
- java - 什么类型的数组(代码)适用于这个问题?
- python - 如何修复错误:“make”不是内部或外部命令、可运行程序或批处理文件
- javascript - Vue.js 将 getter 存储在变量中时会发生奇怪的事情
- php - PHP 用文本“或”转换分号 (;)
- c++ - 代码块中的清单配置在哪里?
- java - 无法反序列化来自 kafka 主题的 json 字符串,该主题在蛇案例中具有属性
- android - 使用 react-native-firebase v6,应用程序在前台收到通知时崩溃
- c - 错误:在原始套接字中使用 sendto() 时地址错误
- swift - 如何使用完成处理程序将图像放入 SwiftUI 视图