2009-09-02 55 views
1

我有一種情況,當數據庫中的某些內容發生更改時,需要通知某些用戶。我的想法是趕上pre_savepost_save信號,並作出某種差異和郵件。一般來說,它運作良好,但我不知道如何獲得m2m領域的差異。使用ManyToMany字段比較django模型對象

目前,我有這樣的事情:

def pre_save(sender, **kwargs): 
    pk = kwargs['instance'].pk 
    instance = copy.deepcopy(sender.objects.get(pk=pk)) 
    tracking[sender] = instance 

def post_save(sender, **kwargs): 
    instance = copy.deepcopy(kwargs['instance']) 
    print diff(instance, (tracking[sender])) # TODO: don't print, save diff somewhere 

DIFF功能應適用於每一個模型(在mommet我有四個模型類)。通過深度拷貝,我可以保存舊模型,但是我不知道如何保存m2m字段,因爲它們在單獨的表格中(是的,我知道我可以獲取這些數據,但是在執行的部分,我不知道哪些字段是m2m,我不想爲每個模型創建不同的插槽)。我想要的是通用解決方案,因此我可以稍後添加模型而不考慮通知部分。

我的計劃是在save()之後調用get_data()clear_data()函數以清除插槽產生的差異。

這樣做的好方法嗎?有沒有更好的辦法?有Django的應用程序可以爲我做這個工作嗎?

請原諒我的英語,這不是我的母語。

回答

6

首先,您不需要爲此使用deepcopy。從數據庫中重新查詢發件人將返回一個「新鮮」對象。

def pre_save(sender, **kwargs): 
    pk = kwargs['instance'].pk 
    instance = sender.objects.get(pk=pk) 
    tracking[sender] = instance 

你可以得到所有的一類多到許多領域的列表,並檢查與當前實例的值:

for field in sender._meta.local_many: 
    values = field.value_from_object(instance).objects.all() 
    # Now values is a list of related objects, which you can diff