【问题标题】:Django create_or_update get changes fieldsDjango create_or_update 获取更改字段
【发布时间】:2020-06-18 18:20:42
【问题描述】:

我正在使用 Django create_or_update 函数。

在更新的情况下,有没有办法知道更改的字段列表。

显然我可以在之前使用get_or_create 函数,以防万一之后,我可以更新模型.. 但我正在寻找一种方法来使用单个查询。

有可能吗?

【问题讨论】:

  • 我认为它的 update_or_create 没有?我查看了 update_or_create 的 django 代码,它没有任何功能可以使用单个查询告诉更新的字段。 reference

标签: python sql django


【解决方案1】:

update_or_create(defaults=None, **kwargs)

update_or_create 方法尝试根据给定的 kwargs 从数据库中获取对象。如果找到匹配项,它会更新默认字典中传递的字段。

查询不关心更新的字段是否改变,“default”中的所有字段都会更新

返回 (object, created) 的元组,其中 object 是创建或更新的对象, created 是一个布尔值,指定是否创建了新对象。

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#update-or-create

【讨论】:

    【解决方案2】:

    也许这不是最好的解决方案,但我认为它可以完成工作。您可以检索将要更新的实例,然后使用 filter() 和 lambda 函数计算已更改的字段,如 Rahul Gupta 的this 回答中所建议的那样。

    假设您可以通过docs 中报告的 first_name 和 last_name 来识别实例:

    old_instance = Person.objects.filter(first_name=first_name, last_name=last_name)
    old_instance = old_instance[0] if old_instance else None
    
    new_instance, created = Person.objects.update_or_create(
        first_name=first_name, last_name=last_name,
        defaults={'first_name': 'Bob'},
    )
    
    # it's been updated and we have the old instance
    if not created and old_instance:
        # get a list of the model's fields
        fields = Person._meta.get_all_field_names()
        # compute the fields which have changed
        diff_fields = filter(lambda field: getattr(old_instance,field,None)!=getattr(new_instance,field,None), fields)
    

    此时的 diff_fields 列表应该只包含 first_name

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 1970-01-01
      • 2017-02-28
      • 2012-12-17
      • 2017-09-14
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多