2015-02-23 79 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