如何更新模型中的字段而不在django中创建新记录?

Rub*_*nes 39 django django-models

我在django中有一个模型,我只想更新,也就是说,当我调用它并设置数据时,它不会创建新记录,只更新现有记录.我怎样才能做到这一点?这是我有的:

class TemperatureData(models.Model):   
    date = models.DateTimeField()   
    value = models.PositiveIntegerField()   
    alert = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

ars*_*ars 80

如果从数据库中获取模型实例,则调用save方法将始终更新该实例.例如:

t = TemperatureData.objects.get(id=1)
t.value = 999  # change field
t.save() # this will update only
Run Code Online (Sandbox Code Playgroud)

如果您的目标是阻止任何INSERT,那么您可以覆盖该save方法,测试主键是否存在并引发异常.有关详细信息,请参阅以下内容

  • 是不是有另一种解决方案?这似乎更像是"SELECT/UPDATE"而不仅仅是"UPDATE" (2认同)

Rom*_*val 16

有时可能需要原子地执行更新,即使用对数据库的一个更新请求而不先读取它。

此外get- set attribute-save可能会造成问题,如果这样的更新可以同时或者如果您需要设置基于旧字段值的新值来完成。

在这种情况下的查询表达式连同update由有用5:

TemperatureData.objects.filter(id=1).update(value=F('value') + 1)
Run Code Online (Sandbox Code Playgroud)


Zam*_*zal 11

你应该这样理想地做到这一点

t = TemperatureData.objects.get(id=1)
t.value = 999
t.save(['value'])
Run Code Online (Sandbox Code Playgroud)

这允许您指定应保存哪个列,并保留其当前在数据库中的剩余列.(https://code.djangoproject.com/ticket/4102)!

  • 我喜欢这个答案,但在当前版本中,您需要使用 `t.save(update_fields=['value'])` 来[强制更新](https://docs.djangoproject.com/en/3.1/ref /models/instances/#specifying-which-fields-to-save)。 (7认同)