Python之django(ORM常用字段和参数)
文章目录
-
- Python之django(ORM常用字段和参数)
-
- 一、测试环境的搭建
- 二、单表操作之必知必会十三条
-
- 1、all():查询所有结果
- 2、filter(\**kwargs): 它包含了与所给筛选条件相匹配的对象
- 3、get(\**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
- 4、exclude(\**kwargs): 它包含了与所给筛选条件不匹配的对象
- 5、values(\*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
- 6、values_list(\*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
- 7、order_by(\*field): 对查询结果排序
- 8、reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
- 9、distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),(注意只有在PostgreSQL中支持按字段去重。)
- 10、count(): 返回数据库中匹配查询(QuerySet)的对象数量。
- 11、first(): 返回第一条记录
- 12、**last(): 返回最后一条记录**
- 13、exists(): 如果QuerySet包含数据,就返回True,否则返回False
- 三、单表查询之神奇的下划线
- 四、外键的增删改查
- 五、神奇的双下划线查询
- 六、外键的正反向概念
- 七、多表查询
- 八、聚合查询
- 九、分组查询
- 十、F与Q查询
- 十一、django中开启事务
- 十二、ORM中常用字段及参数
- 十三、choices参数
- 十四、多对多的三种创建方式
一、测试环境的搭建
当我们新建一个应用时,这个应用通常会自带一个test.py的文件这个文件就是测试文件。我们学要把测试所需的环境搭建起来,然后在文件书写要测试的代码右键直接run test.py就可以了,不需要再把django项目启动起来
此时控制台会输出代码运行的结果(熟悉的感觉又回来了)
测试环境的搭建如下代码
from django.test import TestCase
# Create your tests here.
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Mysite03.settings")
import django
django.setup()
print('就一个字,帅!') # 就一个字,帅!
例如:想测试往数据库里添加数据是否成功
from django.test import TestCase
# Create your tests here.
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Mysite03.settings")
import django
django.setup()
from app01 import models
reg_obj = models.student.objects.create(
student_name='小张',
student_account='xiaozhang',
student_pwd='123456',
student_age='22',
student_hobby='1'
)
see_obj = models.student.objects.filter(student_account='xiaozhang').first()
print(see_obj)
# 就一个字,帅!
# 小张
二、单表操作之必知必会十三条
queryset是查询集,就是传到服务器上的url里面的内容。Django会对查询返回的结果集QuerySet进行缓存,这里是为了提高查询效率。也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才回去数据库查询。
1、all():查询所有结果
print(models.student.objects.all())
返回的是所有queryset对象
# <QuerySet [<student: jason>, <student: egon>, <student: ly>, <student: 小张>]>
2、filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
print(models.student.objects.filter(student_name='小张'))
# <QuerySet [<student: 小张>]>
3、get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
get_something = models.student.objects.get(id=3)
print(get_something,get_something.student_age)
# egon 19
get_something = models.student.objects.get(id=100)
print(get_something,get_something.student_age)
# app01.models.DoesNotExist: student matching query does not exist.
4、exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
print(models.student.objects.exclude(student_is_delete=True))
# <QuerySet [<student: jason>, <student: ly>, <student: 小张>]>
5、values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
print(models.student.objects.values('student_is_delete'))
# <QuerySet [{'student_is_delete': False}, {'student_is_delete': True}, {'student_is_delete': False}, {'student_is_delete': False}]>
6、values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
print(models.student.objects.values_list('student_is_delete'))
# <QuerySet [(False,), (True,), (False,), (False,)]>
7、order_by(*field): 对查询结果排序
print(models.student.objects.order_by('student_age')) # 默认按升序排列
# <QuerySet [<student: jason>, <student: egon>, <student: ly>, <student: 小张>]>
8、reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
print(models.student.objects.order_by('student_age').reverse())
# <QuerySet [<student: ly>, <student: 小张>, <student: egon>, <student: jason>]>
9、distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),(注意只有在PostgreSQL中支持按字段去重。)
10、count(): 返回数据库中匹配查询(QuerySet)的对象数量。
print(models.student.objects.all().count())
# 4
11、first(): 返回第一条记录
print(models.student.objects.order_by('student_age').reverse().first())
# ly
12、last(): 返回最后一条记录
print(models.student.objects.order_by('student_age').reverse().last())
# jason
13、exists(): 如果QuerySet包含数据,就返回True,否则返回False
print(models.student.objects.filter(student_name='小张').exists())
# True
三、单表查询之神奇的下划线
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and
类似的还有:startswith,istartswith, endswith, iendswith
date字段还可以:
models.Class.objects.filter(first_day__year=2017)
date字段可以通过在其后加__year,__month,__day等来获取date的特点部分数据
# date
#
# Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
# Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
# year
#
# Entry.objects.filter(pub_date__year=2005)
# Entry.objects.filter(pub_date__year__gte=2005)
# month
#
# Entry.objects.filter(pub_date__month=12)
# Entry.objects.filter(pub_date__month__gte=6)
# day
#
# Entry.objects.filter(pub_date__day=3)
# Entry.objects.filter(pub_date__day__gte=3)
# week_day
#
# Entry.objects.filter(pub_date__week_day=2)
# Entry.objects.filter(pub_date__week_day__gte=2)
需要注意的是在表示一年的时间的时候,我们通常用52周来表示,因为天数是不确定的,老外就是按周来计算薪资的哦~
四、外键的增删改查
models.py
"""
需要明确的关系:
出版者对书的关系为一对多(一个出版社可以出版多本书)
书和作者的关系为多对多的关系(多个作者可以出版一本书,一本书也可以有多个作者)
作者和作者详情是一对一关系(一个作者只能由一个作者详情)
"""
# 创建书这张表
class Book(models.Model):
title = models.CharField(max_length=32,verbose_name='书名')
price = models.DecimalField(max_digits=8,decimal_places=2,verbose_name='书价格')
# 出版社对书
publish = models.ForeignKey(to='Publish')
# 书对作者
author = models.ManyToManyField(to='Authors')
# 创建出版社表
class Publish(models.Model):
name = models.CharField(max_length=32,verbose_name='出版社名'