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

时间:2018-06-19 10:23:13

标签: django annotations django-admin django-orm

在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

我现在正在寻找用问号代替的问题。

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

1 个答案:

答案 0 :(得分:0)

您可以添加LogEntry DateField as described here而不是使用auto_add个对象,并根据它进行排序 - 这也会记录来自外部的实例更改管理面板(LogEntry仅注册通过管理面板进行的更改)。