Django更新对象

时间:2010-04-26 10:30:00

标签: django

如何在同一个查询集上运行update和select语句,而不是必须执行两个查询,一个用于选择对象,另一个用于更新对象?

SQL中的等价物如下:

update my_table set field_1 = 'some value' where pk_field = some_value

6 个答案:

答案 0 :(得分:182)

使用查询集object update method

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

答案 1 :(得分:50)

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

obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()
  

Django如何知道更新与插入
  如果对象的主键属性设置为计算结果为True的值(即值   除了None或空字符串之外,Django执行UPDATE。如果   未设置对象的主键属性或UPDATE没有设置   更新任何东西,Django执行INSERT。

参考:https://docs.djangoproject.com/en/1.9/ref/models/instances/

答案 2 :(得分:5)

此答案比较了以上两种方法。 如果要在一行中更新许多对象,请执行:

# 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”个数据库查询相比,方法1仅进行一个数据库查询。 (对于查询集中的n个项目)

  2. 第一种方法进行一个数据库查询,即UPDATE,第二种方法进行两个数据库查询:SELECT然后是UPDATE。

  3. 权衡是,假设您有任何触发器,例如更新updated_on或任何此类相关字段,则不会在直接更新(即方法1)上触发。

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

答案 3 :(得分:0)

只有在serializer情况下,您才能以非常简单的方式进行更新!

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()

答案 4 :(得分:0)

如果您需要根据旧的字段值来设置新值,例如:

                        Object
Time                          
2019-08-02 09:50:10.100      A
2019-08-02 09:50:10.200      A
2019-08-02 09:50:10.300    NaN
2019-08-02 09:50:10.400      A
2019-08-02 09:50:10.100      B
2019-08-02 09:50:10.200      B
2019-08-02 09:50:10.300    NaN
2019-08-02 09:50:10.400      B

使用query expressions

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

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

答案 5 :(得分:0)

第一种方法

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

第二种方法

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()

第四种方法

如果需要pk=some_value存在,则使用updatecreate换成update_or_create

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