我想创建一个带有表格的视图,列出用户对任何对象进行的所有更改(创建/修改)。
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及其时间段)已在我的数据库中。
有关处理此问题的最佳方法的任何想法吗?
答案 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