Django模型操作常用方法
1.Save()
基本方法:object.save()
save顾名思义是保存的意思,在django中既可以进行新增也可以进行修改操作。具体判定的算法如下:
1.如果对象的主键属性为一个求值为True的值(例如,非None值或非空字符串),Django将执行UPDATE。
2.如果对象的主键属性没有设置或者UPDATE没有更新任何记录,Django将执行INSERT。
Save函数可跟参数如下:
Model.save([force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None])
高级方法:重写Save()
重写的方式是覆盖模型的方法
1.添加其他操作
defsave(self,*args,**kwargs):
do_something()
super(YourModel,
self).save(*args,**kwargs)
# Call the "real" save() method.
do_something_else()
2.添加判断条件
defsave(self,*args,**kwargs):
ifself.name
=="Yoko Ono's blog":
return # Yoko shall never have her own blog!
else:
super(YourModel, self).save(*args,**kwargs)
# Call the "real" save() method.
注意:批量操作中被覆盖的模型方法不会被调用
2.返回新的查询集的方法
filter
filter(**kwargs):返回一个新的QuerySet,包含与给定的查询参数匹配的对象。其中查找的参数(**kwargs)应该满足字段查找中的格式。在底层的SQL语句中,多个参数通过AND连接。
exclude
返回一个新的QuerySet,它包含不满足给定的查找参数的对象。在底层的SQL语句中,多个参数通过AND连接,然后所有的内容放入NOT()中。
例如:
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
等价于SQL:
SELECT ... WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
不过它的严格写法是:
Entry.objects.exclude(pub_date__gt=datetime.date(2005,1,3)).exclude(headline='Hello')
等价于SQL:
SELECT ... WHERE NOT pub_date > '2005-1-3' AND NOT headline = 'Hello'
Annotate
使用提供的查询表达式Annotate
查询集中的每个对象。查询表达式可以是一个简单的值、模型(或关联模型)字段的一个引用或对查询集中的对象一个聚合函数(平均值、和等)。
例如,如果你正在操作一个Blog列表,你可能想知道每个Blog有多少Entry:
>>> fromdjango.db.models
importCount
>>> q=
order_by
order_by(*fields):默认情况下,QuerySet根据模型Meta类的ordering选项排序。你可以使用order_by方法给每个QuerySet指定特定的排序。
默认情况下,QuerySet
根据模型Meta类的ordering选项排序。你可以使用order_by方法给每个QuerySet指定特定的排序。
例如:
Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
上面的结果将按照pub_date
降序排序,然后再按照headline升序排序。"-pub_date"前面的负号表示降序排序
若要按照另外一个模型中的字段排序,可以使用查询关联模型时的语法。即通过字段的名称后面跟上两个下划线(__),再跟上新模型中的字段的名称,直至你希望连接的模型。例如:
Entry.objects.order_by('blog__name', 'headline')
reverse
reverse() 方法反向排序QuerySet中返回的元素。第二次调用reverse()将恢复到原有的排序。
如要获取QuerySet
中最后五个元素,你可以这样做:
my_queryset.reverse()[:5]
注意,这与Python
中从一个序列的末尾进行切片有点不一样。上面的例子将首先返回最后一个元素,然后是倒数第二个元素,以此类推。如果我们有一个Python序列,当我们查看seq[-5:]时,我们将一下子得到倒数五个元素。Django不支持这种访问模型(从末尾进行切片),因为它不可能利用SQL高效地实现。
同时还要注意,reverse()
应该只在一个已经定义排序的QuerySet上调用(例如,在一个定义了默认排序的模型上,或者使用order_by()的时候)。如果QuerySet没有定义排序,调用reverse()将不会有任何效果(在调用reverse()之前没有定义排序,那么调用之后仍保持没有定义)。
distinct
返回一个在SQL
查询中使用SELECT DISTINCT的新QuerySet。它将去除查询结果中重复的行。
values
返回一个ValuesQuerySet
——QuerySet
的一个子类,迭代时返回字典而不是模型实例对象。
每个字典表示一个对象,键对应于模型对象的属性名称。
下面的例子将values()
与普通的模型对象进行比较:
# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
[<Blog: Beatles Blog>]
# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]
3.不返回查询集的方法
create
create(**kwargs)是一个在一步操作中同时创建对象并且保存的便捷方法.所以:
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
和:
p = Person(first_name="Bruce", last_name="Springsteen")
p.save(force_insert=True)
是等同的.
get_or_create
一个通过给出的kwargs
来查询对象的便捷方法(如果你的模型中的所有字段都有默认值,可以为空),需要的话创建一个对象。
返回一个由(object, created)组成的元组,元组中的object是一个查询到的或者是被创建的对象,
created是一个表示是否创建了新的对象的布尔值。
这主要用作样板代码的一种快捷方式。例如:
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
obj.save()
如果模型的字段数量较大的话,这种模式就变的非常不易用了。上面的示例可以用get_or_create()重写:
obj,created=Person.objects.get_or_create(first_name='John',last_name='Lennon',defaults={'birthday': date(1940, 10, 9)})
count()
返回在数据库中对应的
QuerySet.对象的个数。count()
永远不会引发异常。
例如:
# Returns the total number of entries in the database.
Entry.objects.count()
# Returns the number of entries whose headline contains 'Lennon'
Entry.objects.filter(headline__contains='Lennon').count()
latest
latest(field_name=None)
通过实践返回表中最近一条记录,使用表中字段名作为查询的日期字段
下面这个例子返回Entry表中按pub_date字段排序的最新的一条记录
Entry.objects.latest('pub_date')
earliest
earliest(field_name=None)
工作方式和上面的latest相同,只是取得的值相反
first
first()
返回结果集的第一个对象,
当没有找到时返回None.如果QuerySet
没有设置排序,则将会自动按主键进行排序
例子:
p = Article.objects.order_by('title', 'pub_date').first()
说明:first()
是一个简便方法 下面这个例子和上面的代码效果是一样
try:
p = Article.objects.order_by('title', 'pub_date')[0]
except IndexError:
p = None
last
last()
工作方式类似first(),只是返回的是查询集中最后一个对象。
exists
exists()
如果QuerySet
包含任何结果,则返回True,否则返回False。它会试图用最简单和最快的方法完成查询,但它执行的方法与普通的QuerySet查询确实几乎相同。
exists() 用于搜寻对象是否在QuerySet中以及QuerySet是否存在任何对象,特别是QuerySet比较大的时候。
查找具有唯一性字段(例如primary_key)的模型是否在一个QuerySet中的最高效的方法是:
entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists():
print("Entry contained in queryset")
update
update(**kwargs)
为特定的字段执行SQL更新查询,然后返回受影响的行数。
例如,将2010年发布的所有blog下entry中的评论关了,可以执行下面操作
>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)
delete
delete()
执行SQL删除时将直接删除设定数据集中的所有记录。
例如,
删除主键为1的blog下的所有entries:
b = Blog.objects.get(pk=1)
# Delete all the entries belonging to this Blog.
>>> Entry.objects.filter(blog=b).delete()
4.字段查找
exact、iexact
exact:精确匹配。区分大小写
例如:
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
iexact:不区分大小写的精确匹配
例如:
Blog.objects.get(name__iexact='beatles blog')
Blog.objects.get(name__iexact=None)
contains、icontains
contains:包含,大小写敏感
例如:
Entry.objects.get(headline__contains='Lennon')
icontains:包含,大小写不明感.
例如:
Entry.objects.get(headline__icontains='Lennon')
in
在一个给定的列表中.
Example:
Entry.objects.filter(id__in=[1, 3, 4])
gt、gte、lt、lte
gt:大于
例子:
Entry.objects.filter(id__gt=4)
Gte:大于或等于
Lt:小于
Lte:小于或等于
startswith、istartswith、endswith、iendswith
startswith:区分大小写,开始位置匹配
例如:
Entry.objects.filter(headline__startswith='Will')
istartswith:不区分大小写,开始位置匹配
endswith:区分大小写,结束位置匹配
iendswith:不区分大小写,结束位置匹配
range
范围
例如:
import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
等价SQL:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
year、month、day
year: 返回精确的年份
例如:
Entry.objects.filter(pub_date__year=2005)
等价SQL:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31';
month: 对于月份时间字段,匹配一个整数从1 (January)到
12 (December).
day: 对于日期和日期时间字段,具体到某一天的匹配。取一个整数的天数。
isnull
值为 True
或False,
相当于SQL语句IS NULL和IS
NOT NULL.
例如:
Entry.objects.filter(pub_date__isnull=True)
等价SQL:
SELECT ... WHERE pub_date IS NULL;
5.常见聚合函数
Avg:
class Avg(expression, output_field=None, **extra)
返回给定expression
的平均值,其中expression必须为数值。
默认的别名:<field>__avg
返回类型:float
Count:
class Count(expression, distinct=False, **extra)
返回与expression
相关的对象的个数。
默认的别名:<field>__count
返回类型:int
有一个可选的参数:
distinct:
如果distinct=True,Count将只计算唯一的实例。它等同于COUNT(DISTINCT
<field>) SQL语句。默认值为False。
Max:
class Max(expression, output_field=None, **extra)
返回expression
的最大值。
默认的别名:<field>__max
返回类型:与输入字段的类型相同,如果提供则为
output_field 类型
Min:
class Min(expression, output_field=None, **extra)
返回expression
的最小值。
默认的别名:<field>__min
返回的类型:与输入字段的类型相同,如果提供则为
output_field类型
StdDev:
class StdDev(expression, sample=False, **extra)
返回expression
的标准差。
默认的别名:<field>__stddev
返回类型:float
有一个可选的参数:
sample:
默认情况下,StdDev
返回群体的标准差。但是,如果sample=True,返回的值将是样本的标准差。
Sum:
class Sum(expression, output_field=None, **extra)
计算expression
的所有值的和。
默认的别名:<field>__sum
返回类型:与输入的字段相同,如果提供则为output_field
的类型
Variance
class Variance(expression, sample=False, **extra)
返回expression
的方差。
默认的别名:<field>__variance
返回的类型:float
有一个可选的参数:
sample
默认情况下,Variance
返回群体的方差。但是,如果sample=True,返回的值将是样本的方差。
转自:http://blog.csdn.net/chr23899/article/details/52079311/
Django模型操作常用方法的更多相关文章
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- django 模型操作
# 添加 Fruit.objects.create(name='Apple') # 更新 UserProfile.objects.filter(user=admin).update(**{'onlin ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- django模型的crud操作
一个建立好的模型,django会生成一套完整的API,以便对对象进行crud操作,下面就详细介绍crud操作. 先说一下操作环境: python2.7, django1.11.8, win7系统,借助 ...
- django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段
一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...
- Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...
- Django模型层之单表操作
Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...
- Django模型层之更多操作
Django模型层之更多操作 一 .ORM字段 1.1 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为 ...
随机推荐
- matlab中cumsum函数
matlab中cumsum函数通常用于计算一个数组各行的累加值.在matlab的命令窗口中输入doc cumsum或者help cumsum即可获得该函数的帮助信息. 格式一:B = cumsum(A ...
- SpringBoot项目@RestController使用 redirect 重定向无效
Spring MVC项目中页面重定向一般使用return "redirect:/other/controller/";即可. 而Spring Boot当我们使用了@RestCont ...
- 用 Mathematica 获取图片的 RGB 三基色
ColorConvert[*, "RGB"] // InputForm 其中 * 表示你把你的图片拖入 Mathematica 中.
- 液晶流在齐次 Besov 空间中的正则性准则
在 [Zhang, Zujin. Regularity criteria for the three dimensional Ericksen–Leslie system in homogeneous ...
- 已知 $AB$, 求 $BA$
设 $A,B$ 分别是 $3\times 2$ 和 $2\times 3$ 实矩阵. 若 $\dps{AB=\sex{\ba{ccc} 8&0&-4\\ -\frac{3}{2}& ...
- Contest2158 - 2019-3-14 高一noip基础知识点 测试3 题解版
传送门 预计得分:0 实际得分:90 还行 T1 数学卡精 二分double卡精 反正就是卡精 怎么办?卡回去!! 将double*=1e4,变成一个long long 注意四舍五入的奇技淫巧 代码 ...
- thinkphp 5.6以上版本出现No input file specified解决办法
打开thinkphp,出现No input file specified. 解决方法:在工程下的.htaccess文件里, 把RewriteRule ^(.*)$ index.php/$1 [QSA, ...
- 删除对象的某个属性 delete
有时候我们可能会遇到需要删除一个对象的某个属性的这种情况,保留剩下的,不想遍历,那我们就可以使用delete操作符, let obj = { a: 1, b: 2, c: 3 } delete obj ...
- 330 div+css Experience
今天学习的div,感觉对编辑html更为方便快捷,但还是需要多练,多熟悉一下思路和逻辑方式 越来越感觉,代码不是重要的,重要的是方向和思路,am的float clearfloat 及属性,还有over ...
- LESS知识总结
知识体系 1.认识less 2.使用less 3.变量( variables ) 4.混合 ( mixins ) 5.嵌套规则 ( nested-rules ) 6.运算(operation ...