django model中的save()方法

Model.save(force_insert=Falseforce_update=Falseusing=DEFAULT_DB_ALIASupdate_fields=None)

id和pk

如果一个model里没有显示声明哪一个字段(field)是主键(即在某个字段里声明primary_key=True),则django会自动生成一个名为id的AutoFields作为主键。model里的主键都有一个别名叫做pk(primary_key的缩写),无论这个主键是自动生成的还是我们指定的。使用pk和使用主键的名字是一样的效果。

注意1:对于一个要新加入数据库的model实例,在save()执行之前是无法知道它的id的,因为要算数据库中已有多少个本model才能算出它的id值。

>>> b2 = Blog(name=‘Cheddar Talk‘, tagline=‘Thoughts on cheese.‘)
>>> b2.id     # Returns None, because b doesn‘t have an ID yet.
>>> b2.save()
>>> b2.id     # Returns the ID of your new object.

force_update和force_insert

这两个参数一般较少用到,因为save()之后django执行的是UPDATE或者INSERT这两条SQL语句的哪一条,遵循如下算法:

1.如果这个对象已经有主键而且主键的值是True的(即不是None或者空字符串等),就执行UPDATE。

2.如果没有主键或者这条save()不会update任何字段,那么它就INSERT。

只有在某些特定情况下,需要强制save()执行INSERT或UPDATE时才会使force_update=True或force_insert=True(比如我要求能UPDATE就UPDATE,不能我也不取INSERT,那么我就把这个force_update参数设置为True)。

update_fields

用来指定哪些字段需要更新,别的不更新。默认是None,这样所有字段都会更新一遍。有时候字段很多而我们只需要更新很少的字段,可以用这个参数来提高一下效率。注意要给它的是一个可迭代对象(比如list等)。如果给它一个空的可迭代对象,那么就什么都不更新(注意和None不同,如果等于None是更新全部字段)。

一旦update_fields参数不使用默认值None,那么这条save()语句就是强制执行UPDATE的。

product.name = ‘Name changed again‘
product.save(update_fields=[‘name‘])
时间: 2024-12-30 00:55:30

django model中的save()方法的相关文章

UUIDField在Django Model中的使用经验

今天下午在将数据库从旧库导入到新库时,完成后发现Django网站无法打开,报"ValueError, badly formed hexadecimal UUID string",最终定位到原因是一个UUIDField类型字段的值为0,造成Django无法将0验证为UUID类型,从而引发ValueError异常.现总结UUIDField在Django Model中的使用经验如下. 在Django中UUIDField类型的字段可以作为主键(主键是绝对不可能为NULL值的)使用,这个是丝毫没

Django model 中meta options之 abstract

当abstract=True时,这个model就变成了abstrct base class,那这个基类有什么特性呢? 当某一model中设置了abstract=True时,就会使该model中的字段都不会产生对应的表,而是可以作为基类加入到其他model中 那有什么用呢? 有时多个model有些相同的字段,这样很浪费时间,而且重复本身也不利于代码简洁.好该abstract来了 看官例: from django.db import models class CommonInfo(models.Mo

获取django model 中得fields

UserProfile._meta.fields [<django.db.models.fields.related.OneToOneField: user>,  <django.db.models.fields.CharField: username>, <django.db.models.fields.CharField: nickname>, <django.db.models.fields.EmailField: email>, <django

Django model 中的字段解释

Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需要直接使用这个字段:如果你不指定主键的话,系统会自动添加一个主键字段到你的model.(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox. CharField:字符串字段,单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField,Ch

django model中get()和filter()方法的区别

django的get()方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错. django的filter()方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[].

Django model中数据批量导入bulk_create()

在Django中需要向数据库中插入多条数据(list).使用如下方法,每次save()的时候都会访问一次数据库.导致性能问题: for i in resultlist: p = Account(name=i) p.save() 在django1.4以后加入了新的特性.使用django.db.models.query.QuerySet.bulk_create()批量创建对象,减少SQL查询次数.改进如下: querysetlist=[] for i in resultlist: querysetl

Django 【第二十六】Django model中的 class Meta 详解

class Foo(models.Model): bar = models.CharField(maxlength=30) class Meta: # ... Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等. 下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 完全是可选的. app_label app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包

Django model 中的 class Meta 详解

class Foo(models.Model): bar = models.CharField(maxlength=30) class Meta: # ... Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等. 下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 完全是可选的. app_label app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包

Django model中的 class Meta 详解

class Foo(models.Model): bar = models.CharField(maxlength=30) class Meta: # ... Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等. 下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 完全是可选的. app_label app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包