繁体   English   中英

具有ManyToMany字段的Diff Django模型对象

[英]Diff django model objects with ManyToMany fields

当数据库中的某些内容发生更改时,我需要通知一些用户。 我的想法是捕获pre_savepost_save信号,并进行某种比较并将其邮寄。 通常它的效果很好,但我不知道如何获取m2m字段的差异。

目前,我有这样的事情:

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

差异函数应适用于每个模型(在mommet中,我有四个模型类)。 使用Deepcopy,我可以保存旧模型,但是我不知道如何保存m2m字段,因为它们位于单独的表中(是的,我知道我可以获取此数据,但是在执行时,我不知道什么字段是m2m,我不想为每个模型创建不同的广告位)。 我想要的是通用解决方案,因此我可以稍后添加模型而无需考虑通知部分。

我的计划是在save()之后调用get_data()clear_data()函数,以清理插槽已生成的差异。

这是这样做的好方法吗? 有没有更好的办法? 有Django应用程序可以为我完成这项工作吗?

请问我的英语不是我的母语。

首先,您不需要为此使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM