【问题标题】:Diff django model objects with ManyToMany fields使用 ManyToMany 字段区分 django 模型对象
【发布时间】:2010-11-24 20:33:39
【问题描述】:

我有一种情况,当数据库中的某些内容发生变化时,我需要通知一些用户。我的想法是捕捉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

Diff 函数应该适用于每个模型(在 mommet 我有四个模型类)。使用 deepcopy 我可以保存旧模型,但我不知道如何保存 m2m 字段,因为它们位于单独的表中(是的,我知道我可以获取这些数据,但是在执行的那一刻我不知道哪些字段是m2m,我不想为每个模型创建不同的插槽)。我想要的是通用解决方案,所以我可以稍后添加模型而不考虑通知部分。

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

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

对不起,我的英语不是我的母语。

【问题讨论】:

    标签: python django diff models


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-04
      • 2016-10-12
      • 2013-05-19
      • 2012-06-22
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      相关资源
      最近更新 更多