class ProfileSetting(models.Model):
first_name = models.CharField(blank=True)
logo = models.ImageField(blank=True, null=True, upload_to="profile/logo/")
update_data = {
"first_name": "john",
"logo": request.FILES['logo'] # logo will not be properly update
}
ProfileSetting.objects.filter(pk=some_value).update(**update_data)
8条答案
按热度按时间3mpgtkmj1#
使用queryset对象
update
方法:m1m5dgzv2#
Django数据库对象使用相同的保存()方法来创建和更改对象。
Django如何知道UPDATE和INSERT
如果对象的主键属性被设置为一个计算结果为True的值(即,一个非None或空字符串的值),Django执行UPDATE。如果对象的主键属性没有被设置或UPDATE没有更新任何内容,Django执行INSERT。
参考编号:https://docs.djangoproject.com/en/1.9/ref/models/instances/
a1o7rhls3#
这个答案比较了上述两种方法。如果你想在一行中更新很多对象,可以选择:
否则,您必须遍历查询集并更新各个对象:
1.方法1更快,因为它只进行一个数据库查询,而方法2进行“n+1”个数据库查询。(对于查询集中的n个项目)
1.第一种方法生成一个数据库查询,即UPDATE,第二种方法生成两个:选择,然后更新。
1.折衷的办法是,假设你有任何触发器,比如更新
updated_on
或任何类似的相关字段,它不会在直接更新ie方法1时被触发。1.方法1用于查询集,因此可以一次更新多个对象,而不是方法2的情况。
f45qwnt84#
第一种方法
第二种方法
第三种方法
使用
get_object_or_404
第四种方法
如果您需要
pk=some_value
是否存在,则update
是create
,否则使用update_or_create
创建新的create
。iecba09b5#
如果您需要根据旧字段值设置新值,请执行以下操作:
使用query expressions:
这将原子地执行更新,即使用对数据库的一个更新请求而不首先阅读它。
zpgglvta6#
只有在
serializer
的情况下,你可以用很简单的方式更新!只在
form
的情况下的事情!wljmcqd87#
接受的答案效果很好,但它会带来一些不必要的副作用。
例如,您正在使用imageField,update()将工作并更新其他数据,但不更新您的imageField数据
下面是一些示例,其中有很好的解释Django ImageField is not updating when update() method is used
brjng4g38#
上面提到的答案工作得很好,但它会产生一些不必要的副作用,因此为了避免此类错误,请将数据库代码写入异常块中。