Django用户审核

时间:2015-02-23 12:12:31

标签: django django-users

我想创建一个带有表格的视图,列出用户对任何对象进行的所有更改(创建/修改)

Django Admin站点具有类似的功能,但这仅适用于在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 个答案:

答案 0 :(得分:1)

Django admin使用通用外键来处理你的情况,所以你应该做那样的事情。让我们来看看django admn是如何做到的(https://github.com/django/django/blob/master/django/contrib/admin/models.py):

class LogEntry(models.Model):
    action_time = models.DateTimeField(_('action time'), auto_now=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    content_type = models.ForeignKey(ContentType, blank=True, null=True)
    object_id = models.TextField(_('object id'), blank=True, null=True)
    object_repr = models.CharField(_('object repr'), max_length=200)
    action_flag = models.PositiveSmallIntegerField(_('action flag'))
    change_message = models.TextField(_('change message'), blank=True)

因此,您可以添加一个额外的模型(LogEntry),该模型将ForeignKey保存给更改(添加/修改)对象的用户GenericForeignKey({{3} }})到被修改的对象。

然后,您可以修改视图以在修改对象时添加LogEntry个对象。如果要按User显示所有更改,请执行以下操作:

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

我写了一篇很好的博客文章(在django中审核对象),这可能很有用:https://docs.djangoproject.com/en/1.7/ref/contrib/contenttypes/#generic-relations