gpt4 book ai didi

django - MyModel.objects.update_or_create() --> Boolean 数据是否更新?

转载 作者:行者123 更新时间:2023-12-04 05:40:10 27 4
gpt4 key购买 nike

AFAIK Django 不提供查看数据是否被 update_or_create() 更改的通用方法。

bool 值 created告诉我创建了一行。但是我怎么知道数据是否已更改(更改数据的 SQL UPDATE)

例子:

obj, created = MyModel.update_or_create(pk=12345,
defaults=dict(name='Doctor Zhivago'))

有以下三种情况:
  • obj被创建。没问题,我有 bool 变量 created
  • obj未创建,已更新。例如,以前的名字是“Machuca”。
  • obj未创建且未更新。例如,以前的名字已经是“日瓦戈医生”。

  • 我目前无法区分 case2 和 case3。

    最佳答案

    受到@bakkal 的启发,我编写了一个 mixin 类,您可以将其应用于自定义 Manager 类,然后将该自定义 Manager 分配给您的 MyModel类(class)。这会将返回的元组的格式更改为 (obj, created, updated) .在 defaults.items() 中的值的循环中我正在检查是否有任何新值与旧值不同。

    class UpdateOrCreateMixin(object):
    def update_or_create_v2(self, defaults=None, **kwargs):
    """
    Look up an object with the given kwargs, updating one with defaults
    if it exists, otherwise create a new one.
    Return a tuple (object, created, updated), where created and updated are
    booleans specifying whether an object was created.
    """
    defaults = defaults or {}
    lookup, params = self._extract_model_params(defaults, **kwargs)
    self._for_write = True
    with transaction.atomic(using=self.db):
    try:
    obj = self.select_for_update().get(**lookup)
    except self.model.DoesNotExist:
    obj, created = self._create_object_from_params(lookup, params)
    if created:
    return obj, created, False
    updated = False
    for k, v in defaults.items():
    oldattr = getattr(obj, k)
    if oldattr != (v() if callable(v) else v):
    updated = True
    setattr(obj, k, v() if callable(v) else v)
    obj.save(using=self.db)
    return obj, False, updated

    class CustomManager(UpdateOrCreateMixin, models.Manager):
    pass

    class MyModel(models.Model)
    field = models.CharField(max_length=32)
    objects = CustomManager()

    obj, created, updated = MyModel.objects.update_or_create_v2(pk=12345,
    defaults=dict(name='Doctor Zhivago'))

    关于django - MyModel.objects.update_or_create() --> Boolean 数据是否更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45147019/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com