[英]Diff django model objects with ManyToMany fields
当数据库中的某些内容发生更改时,我需要通知一些用户。 我的想法是捕获pre_save
和post_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.