如何在 Django 中的管理日志中添加可排序的列



在 Django 管理区域中,我需要显示对象上次被其他用户修改的时间。因此,我想利用 Django 的内置管理日志。我想出了这个解决方案:

class MyModel(models.Model):
...
@property
def admin_last_modified(self):
from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.models import ContentType
try:
logentry = LogEntry.objects.filter(
object_id=self.pk,
content_type_id=ContentType.objects.get_for_model(self.__class__)
).order_by('action_time')[0]
except:
return ''
return '{} by {}'.format(logentry.action_time, logentry.user)

和管理员类:

@admin.register(MyModel)
class MyAdmin(admin.ModelAdmin):
list_display = ( ..., 'admin_last_modified' )

缺点,这对我来说是一个阻碍,是列不可排序。

为此,根据我收集的信息,我需要将该属性重新表述为某种注释。但是我已经尝试过,但还没有想出如何做到这一点的想法:

class MyAdmin(admin.ModelAdmin):
def get_queryset(self):
queryset = super().get_queryset(request)
queryset = queryset.annotate(
admin_last_modified=# ???
)
return queryset

我现在正在寻找用什么来代替问号。

如何编写注释,从另一个基本不相关的表中获取一行信息?

您可以按照此处所述添加具有auto_addDateField并基于此进行排序,而不是使用LogEntry对象 - 这也将记录来自管理面板外部的实例更改(LogEntry仅注册通过管理面板所做的更改(。

最新更新