07 Django -- ORM单边查询
单表常用的查询方式
models.py 图书馆管理
from django.db import models
# Create your models here.
class MyLibrarys(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
price = models.DecimalField(max_digits=5, decimal_places=2)
publication_date = models.DateField()
press = models.CharField(max_length=16)
def __str__(self):
return self.name
all(): 查询所有结果,结果是Queryset类型
ret = models.MyLibrarys.objects.all()
# 结果时Queryset类型<QuerySet [<MyLibrarys: python1>,...]
filter():
返回Queryset类型,Queryset类型的数据还能够继续调用fitler方法
ret = models.MyLibrarys.objects.filter()
# 获取全部数据,Queryset类型
ret = models.UserInfo.objects.filter(id=1000)
# 查不到数据不会报错,返回一个空的<QuerySet []>
and():
ret = models.UserInfo.MyLibrarys.filter(name='alex',press='清华出版社')
get():(只能查一个model对象)
返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
ret = models.MyLibrarys.objects.get(id=2)# 得到的是一个model对象
# 查不到数据会报错
# 查到多个也会报错,例如name以a开头的全部model对象
exclude():
排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是Queryset类型
ret = models.MyLibrarys.objects.exclude(name='alex')
# objects能调用exclude
ret = models.UserInfo.objects.all().exclude(name='alex') # Queryset也能调用exclude
order_by() :升序
Queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是Queryset类型
ret = models.MyLibrarys.objects.all().order_by('字段')
# 升序
ret = models.MyLibrarys.objects.all().order_by('-字段')
# 降序
ret = models.MyLibrarys.objects.all().order_by('-age',id) # 以age降序排列,age相同的以id升序排序
reverse():反转
Queryset类型的数据来调用,对查询结果反向排序,返回值还是Queryset类型。(数据排序之后才能反转)
models.MyLibrarys.objects.all().order_by('id').reverse()
# Qureyset类型
count(): 计数,统计返回结果的数量
models.MyLibrarys.objects.all().count()
first() / last():
获取拿到的第一/最后一条数据,结果是model对象
models.MyLibrarys.objects.all().first() # 也可
exists()
Queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
models.MyLibrarys.objects.filter(id=2).exists()
values()
Queryset类型的数据来调用,返回的QuerySet类型,里面是字典类型数据。
models.MyLibrarys.objects.all().values('name', 'press')
返回QuerySet对象,里面存放字典<QuerySet [{'name': 'python1', 'press': '人民出版社'}...]>
models.MyLibrarys.objects.all().values()
# 返回QuerySet对象,获取所有数据
models.MyLibrarys.objects.values() # objects调用,取所有数据
values_list()
Queryset类型的数据来调用,返回的QuerySet,里面是数组类型数据。
models.MyLibrarys.objects.all().values_list()
distinct():去重
values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
ret = models.MyLibrarys.objects.all().values('字段').distinct() # 对某一字段查询结果去重
ret = models.MyLibrarys.objects.all().values_list('press').distinct()
filter双下划线的查询
models.MyLibrarys.objects.filter(price__in=[100,200,300]) #price值在这三个里面的任意一个的QuerySet对象
models.MyLibrarys.objects.filter(price__gt=100) #大于,大于等于是price__gte=100,别写price>100,这种参数不支持
models.MyLibrarys.objects.filter(price__lt=100)
models.MyLibrarys.objects.filter(price__range=[100,200]) #sql的between and,大于等于100,小于等于200
models.MyLibrarys.objects.filter(name__contains="python") #name值中包含python的
models.MyLibrarys.objects.filter(name__icontains="python") #不区分大小写
models.MyLibrarys.objects.filter(name__startswith="py") #以什么开头,istartswith 不区分大小写
models.MyLibrarys.objects.filter(name__endswith="py") #以什么结尾,iendswith 不区分大小写
xx__isnull=True # xx字段的值为空的所有数据
日期:
models.MyLibrarys.objects.filter(pub_date__year=2012) #日期为2012年, '2012'字符串也行
models.MyLibrarys.objects.filter(pub_date__year__gt=2012)
# 大于2012
models.MyLibrarys.objects.filter(pub_date='2012-12-12') # 查询2012-12-12
models.MyLibrarys.objects.filter(pub_date__year=2012,pub_date__month=12,pub_date__data=12) # 查询2012-12-12
多表查询
表结构
id字段可以不写,自动添加。
一一对应:OneToOneField()
class Author(models.Model):
字段=models.OneToOneField(to='表类名',to_field='id',on_delete=models.CASCADE)
简写:
字段=models.OneToOneField('表类名',on_delete=models.CASCADE)
# 默认找id字段一一对应
多对一:Foreignkey()
db_constraint=False --取消强制约束效果
字段=models.ForeignKey(to="类名",
on_delete=models.CASCADE,)
多对多:ManyToManyField()
ManyToManyField自动创建第三张表
字段=models.ManyToManyField(to='表类名',)
# 自动默认关联两张表的id
元信息Meta:
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。
class Author(models.Model):
class Meta:
db_table='authordetail' #指定表名
ordering = ['-id',] #指定按什么字段排序 只有设置了该属性,查询到的结果才可以被reverse(),否则只能对排序后的结果进行反转(order_by()方法排序过的数据)
index_together #联合索引。
unique_together # 联合唯一索引。
示例:
from django.db import models
# Create your models here.
class Author(models.Model):
"""
作者表
"""
name=models.CharField( max_length=32)
age=models.IntegerField()
# authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE) #
auth=models.OneToOneField("AuthorDetail",on_delete=models.CASCADE)
class AuthorDetail(models.Model):
"""
作者详细信息表
"""
birthday=models.DateField()
telephone=models.CharField(max_length=11)
addr=models.CharField(max_length=64)
# class Meta:
# db_table='authordetail' #指定表名
# ordering = ['-id',]
class Publish(models.Model):
"""
出版社表
"""
name=models.CharField( max_length=32)
city=models.CharField( max_length=32)
class Book(models.Model):
"""
书籍表
"""
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)
publishs=models.ForeignKey(to="Publish",on_delete=models.CASCADE,)
authors=models.ManyToManyField('Author',)