如何选择一个记录和更新它,与一个单一的查询集在Django?

如何在相同的queryset上运行updateselect语句,而不是必须执行两次查询: - 1选择对象 -和一个更新对象

在SQL中等价的东西是这样的:

update my_table set field_1 = 'some value' where pk_field = some_value
308439 次浏览

使用查询集update方法:

MyModel.objects.filter(pk=some_value).update(field1='some value')

Django数据库对象使用相同的save()方法来创建和更改对象。

obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()
< p > Django如何知道UPDATE和INSERT < br > 如果对象的主键属性被设置为一个值,该值的值为True(即,一个值 除了None或者空字符串),Django执行一个UPDATE。如果 对象的主键属性没有设置,或者UPDATE没有设置 更新任何东西,Django执行INSERT

裁判:https://docs.djangoproject.com/en/1.9/ref/models/instances/

这个答案比较了上述两种方法。 如果你想在一行中更新多个对象,输入:

# Approach 1
MyModel.objects.filter(field1='Computer').update(field2='cool')

否则你将不得不遍历查询集并更新单个对象:

#Approach 2
objects = MyModel.objects.filter(field1='Computer')
for obj in objects:
obj.field2 = 'cool'
obj.save()
  1. 方法1更快,因为它只进行一次数据库查询,而方法2进行“n+1”次数据库查询。(对于查询集中的n个项)

  2. 第一个方法是一个数据库查询,即UPDATE,第二个方法是两个:SELECT和UPDATE。

  3. 权衡是,假设你有任何触发器,比如更新updated_on或任何类似的相关字段,它不会在直接更新时被触发,即方法1。

  4. 方法1用于查询集,因此可以一次更新多个对象,而方法2则不行。

只有在serializer中才有case的东西,可以用很简单的方式进行更新!

my_model_serializer = MyModelSerializer(
instance=my_model, data=validated_data)
if my_model_serializer.is_valid():


my_model_serializer.save()

只在form情况下的事情!

instance = get_object_or_404(MyModel, id=id)
form = MyForm(request.POST or None, instance=instance)
if form.is_valid():
form.save()

如果你需要基于旧字段值设置新值,那就像这样做:

update my_table set field_1 = field_1 + 1 where pk_field = some_value

使用查询表达式:

MyModel.objects.filter(pk=some_value).update(field1=F('field1') + 1)

这将自动执行更新,即对数据库使用一个更新请求,而不首先读取它。

1号方法

MyTable.objects.filter(pk=some_value).update(field1='some value')

2方法

q = MyModel.objects.get(pk=some_value)
q.field1 = 'some value'
q.save()

第三个方法

通过使用get_object_or_404

q = get_object_or_404(MyModel,pk=some_value)
q.field1 = 'some value'
q.save()

4日法

如果你需要,如果pk=some_value存在,则update,否则通过使用update_or_create create新的。

MyModel.objects.update_or_create(pk=some_value,defaults={'field1':'some value'})

公认的答案很有效,但它会带来一些不必要的副作用。

例如,您正在使用imageField, update()将工作并更新其他数据,但不更新您的imageField数据

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)

这里有一些很好的解释当使用update()方法时,Django ImageField不会更新的例子