【问题标题】:How to Set Multiple Fields in Django Db Record如何在 Django Db 记录中设置多个字段
【发布时间】:2011-08-18 05:35:06
【问题描述】:

我想知道为现有 Django 模型对象的多个字段设置值的最佳方法。我有一个包含许多字段的模型:

class Foo(models.Model):
    Field1 = models.CharField(max_length=40)
    Field2 = models.CharField(max_length=40)
    Field3 = models.CharField(max_length=40)
    etc...

我还有一个字典,其中包含对特定记录的这些字段子集的更改:

data = {'field1': 'value1', 'field5': 'value5', 'field7': 'value7'}
record = Foo.objects.get(pk=1)

我想用data 中的新值设置record 中的字段。解决此问题的最佳方法是什么?有没有办法解压字典并让它修改记录中的相应字段?我意识到我可以使用以下方法遍历字典:

for k, v in data.iteritems():
     setattr(entry, k, v)
entry.save()

我在想可能有一种方法可以调用类似的东西:

entry.set_values(**data)

有这样的事情还是我走错了路?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    更正@brandon 的回答。

    确保使用 .filter() 方法而不是 .get() 因为 .get 方法返回匹配对象或引发 DoesNotExist 异常

    错误: Foo.objects.get(pk=1).update(**data)

    正确: Foo.objects.filter(pk=1).update(**data)

    【讨论】:

      【解决方案2】:

      我自己没有对此进行测试,但您可以通过 Queryset API 将 dict 传递给 .update() 函数:https://docs.djangoproject.com/en/2.0/ref/models/querysets/#update

      Foo.objects.get(pk=1).update(**data)
      

      【讨论】:

      • 更新仅适用于查询集,但这适用于 Foo.objects.filter(pk=1).update(**data)。感谢您的建议。
      • 请注意,这不会触发任何与保存相关的信号,也不会在实例上调用 .save()。这可能是理想的情况,也可能是交易破坏者。如果你需要这个,你可以做Foo.objects.filter(pk=1).update(**date); Foo.objects.get(pk=1).save()
      • 也看到这个问题:stackoverflow.com/questions/1576664/…
      • 链接已损坏。
      • @Cyzanfar 已修复
      猜你喜欢
      • 2018-06-17
      • 2019-03-25
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多