2015-02-23 142 views
0

我想创建视图与一个表,列出了到用户已接通/作出任何对象所有改变(创建/修改)。Django的用户审核

Django Admin站点具有类似的功能,但只适用于在管理员中创建/更改的对象。

我所有的型号都有,除了其特定的领域,按照一般领域,应该用于此目的:

created_by = models.ForeignKey(User, verbose_name='Created by', related_name='%(class)s_created_items',) 
modified_by = models.ForeignKey(User, verbose_name='Updated by', related_name='%(class)s_modified_items', null=True) 
created = CreationDateTimeField(_('created')) 
modified = ModificationDateTimeField(_('modified')) 

我试图玩弄:

u = User.objects.get(pk=1) 
u.myobject1_created_items.all() 
u.myobject1_modified_items.all() 
u.myobject2_created_items.all() 
u.myobject2_modified_items.all() 
... # repeat for >20 models 

..然后将它们与itertool's chain()分组在一起。但是结果并不是一个QuerySet,它使它成为非Django,并且更难处理。

我知道有packages可用,这将为我做,但是有可能实现我想要使用上述模型,而不使用外部包?无论如何,必填字段(created_by/modified_by及其时间字段)都在我的数据库中。

任何想法处理这个最好的方法?

回答

1

Django管理员使用泛型外键来处理你的情况,所以你应该这样做。让我们来看看Django的ADMN是怎么做的(https://github.com/django/django/blob/master/django/contrib/admin/models.py):

所以,你可以添加额外的模型(LogEntry),将举行一个ForeignKey到更改的用户(添加/修改)的对象,一个GenericForeignKeyhttps://docs.djangoproject.com/en/1.7/ref/contrib/contenttypes/#generic-relations)到被修改的对象。

然后,你可以修改你的意见添加LogEntry对象时,对象被修改。当你想通过一个User来显示所有的变化,只是这样做:

 
user = User.objects.get(pk=1) 
changes = LogEntry.objects.filter(user=user) 
# Now you can use changes for your requirement! 

我(在Django审计对象)写一篇好的博客贴子关于这可能是有用的:http://spapas.github.io/2015/01/21/django-model-auditing/#adding-simple-auditing-functionality-ourselves