2009-09-02 66 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 
相关问题