django - 将 LogEntry 加入实际模型

Posted

技术标签:

【中文标题】django - 将 LogEntry 加入实际模型【英文标题】:django - Joining LogEntry to actual models 【发布时间】:2012-01-26 08:40:07 【问题描述】:

所以我使用管理员 LogEntry 对象/表在我的应用程序中记录事件。我有一个视图,我想在其中显示每个 LogEntry。 如果我可以将 LogEntry 与它们所代表的实际对象一起加入,那就太好了(这样我就可以在日志条目中显示对象的属性) 理论上这应该很容易,因为我们有来自 LogEntry 的模型类型和 id,但我不知道如何使用查询集加入它们。

我认为我可以获取不同对象的所有 id 并为每个对象类型制作另一个字典,然后以某种方式加入它们(也许将列表压缩在一起?)但这看起来很愚蠢,而且不是很 djano-ish/pythonic。

有人有更好的建议吗?

** 编辑 ** 只是想澄清我不想使用管理员,而是滚动自定义视图和模板。

【问题讨论】:

【参考方案1】:

最近的 Django 版本需要为 LogEntry 创建代理:

from django.contrib import admin
from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.generic import  GenericTabularInline

class LogEntryProxy(LogEntry):
    content_object = GenericForeignKey('content_type', 'object_id')
    class Meta:
        proxy = True

class LogInline(GenericTabularInline):
    model = LogEntry
    extra = 0

class ItemAdmin(admin.ModelAdmin):
    inlines = [LogInline,]

admin.site.register(models.Item, ItemAdmin)

【讨论】:

【参考方案2】:

据我所知,Django 使用contenttypes framework 在管理员中执行登录。因此,您应该在模型中创建通用关系,然后在管理员中使用 GenericTabularInline 和 GenericStackedInline 显示内联。请参考文章。

from django.contrib import admin
from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.generic import  GenericTabularInline
from django import forms
from some_app import models
from some_app.models import Item

class LogForm(forms.ModelForm):
    class Meta:
        model = LogEntry

class LogInline(GenericTabularInline):
    ct_field = 'content_type'
    ct_fk_field = 'object_id'
    model = LogEntry
    extra = 0

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item

class ItemAdmin(admin.ModelAdmin):
    form = ItemForm
    inlines = [LogInline,]


admin.site.register(models.Item, ItemAdmin)

然后你添加到项目:

class Item(models.Model):
    name = models.CharField(max_length=100)
    logs =  generic.GenericRelation(LogEntry)

此更改不会在您的数据库中创建任何内容,因此无需同步

【讨论】:

酷。我以前从未使用过泛型关系。那么在我的情况下,您是否建议在我的模型中创建与 logEntry 对象的通用关系? 啊感谢代码示例。让事情变得更加清晰。几件事。第一:我不想使用管理员。我想推出自己的视图和模板。第二:这种方式给了我所有项目的列表,然后在查看特定项目时,我会看到所有日志。我需要它反过来。我需要一个日志条目列表以及沿途每个项目的详细信息。这是相关的,因为我执行的查询基于 LogEntries,而不是项目。谢谢! 对不起,我好像忘记了你在问什么,并回答了一些其他问题。 LogEntry 有两个字段“content_type”,它连接到 ContentType 对象,它有方法 get_object_for_this_type(*kwargs),你应该调用这个方法传递 id = log_entry.object_id。这会给你你的对象。这是 GenericForeignKey 所做的,但 LogEntry 没有,所以你必须自己实现它或设置你自己的日志记录(这并不难)。 感谢您的回复,并对我的延误表示歉意。我看到了那个函数,但它似乎有点贵,因为我们必须为我们返回的每个对象进行单独的数据库调用。我想我要去实现我自己的日志记录了....(或者找一个比我聪明的人已经完成了它并成功了)。

以上是关于django - 将 LogEntry 加入实际模型的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:字段admin.LogEntry.user是用惰性引用声明的。

如何将自定义用户模型迁移到 Django 中的不同应用程序?

无法将关键字'user'解析为字段-Django错误

Django框架(二十八)—— Django缓存机制

django 添加adminlog view

如何将另一台Ubuntu DC服务器加入到Samba4 AD DC实现双域控主机模