Django_ORM

增:

a、使用create方式

方式一: Book.objects.create(title="python",price="88",publish_id="1",publication_date="2017-06-18"}

b、使用save方式

方式二:

book1=Book(title="python",price="88",publish_id="1",publication_date="2017-06-18")

book1.save()

删:

Book.objects.filter(id=1).delete()

改:

使用update方法

Book.objects.filter(id=2).update(name="天龙八部")

注意:update()是QuerySet对象的一个方法,get返回的是一个model对象,其没有update方法.

filter返回的是一个QuerySet对象,filter里可以设定多个过滤条件

查:

1、查询方法

filter(**kwargs)            包含了与所给筛选条件相匹配的对象
all()                       查询所有结果
get(**kwargs)               返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都是报错
values(*field)              返回一个ValueQuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
exclude(**kwargs)           包含了与所给的筛选条件不匹配的对象
order by(*field)            对查询结果排序
reverse()                   对查询结果反向排序
distinct()                  从返回结果中剔除重复记录
values_list(*field)         与values()非常相似,返回一个元组序列,values返回一个字典序列
count()                     返回数据库中匹配的记录的数量
first()                     返回数据库中匹配的对象的第一个对象
last()                      返回数据库中匹配的对象的最后一个对象
exists()                    判断一个对象集合中是否包含指定对象,包含返回True,不包含返回False
exclude()            排除满足条件的对象
annotate()            使用聚合函数
dates()                根据日期获取查询集
datetimes()            根据时间获取查询集
none()                创建空的查询集
union()                并集
intersection()        交集
difference()        差集
select_related()    附带查询关联对象
prefetch_related()    预先查询
extra()                附加SQL查询
defer()                不加载指定字段
only()                只加载指定的字段
using()                选择数据库
select_for_update()    锁住选择的对象,直到事务结束。
raw()                接收一个原始的SQL查询

1.filter():

filter(**kwargs)

返回满足查询参数的对象集合。

查找的参数(**kwargs)应该满足下文字段查找中的格式。多个参数之间是和AND的关系。

Student.objects.filter(age__lt=10)#查询满足年龄小于10岁的所有学生对象

2.exclude()

exclude(**kwargs)

返回一个新的QuerySet,它包含不满足给定的查找参数的对象

Student.objects.exclude(age__gt=20, name='lin')#排除所有年龄大于20岁且名字为“lin”的学员集

3.order_by():

order_by(*fields)

默认情况下,根据模型的Meta类中的ordering属性对QuerySet中的对象进行排序

Student.objects.filter(school="阳关小学").order_by('-age', 'name')

上面的结果将按照age降序排序,然后再按照name升序排序。"-age"前面的负号表示降序顺序。 升序是默认的。 要随机排序,使用"?",如下所示:

Student.objects.order_by('?')

4. reverse():

reverse()

反向排序QuerySet中返回的元素。 第二次调用reverse()将恢复到原有的排序。

如要获取QuerySet中最后五个元素,可以这样做:

my_queryset.reverse()[:5]

这与Python直接使用负索引有点不一样。 Django不支持负索引。

5.distinct():

distinct(*fields)

去除查询结果中重复的行。

默认情况下,QuerySet不会去除重复的行。当查询跨越多张表的数据时,QuerySet可能得到重复的结果,这时候可以使用distinct()进行去重。

模糊查询:

like:

    __contains     包含           like '%aaa%'
    __icontains    包含,忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
 
in:
 
    __in
     
    查询在某一范围的书
    Book.objects.filter(publish__in=[10, 20, 30])
 
is null / is not null:
 
    __isnull  判空
     
    Book.objects.filter(name__isnull=True)    // 查询用户名为空的书
    Publish.objects.filter(name__isnull=False)  // 查询用户名不为空的书
 
不等于/不包含于:
 
    Book.objects.filter().excute(publishe=10)    // 查询出版社不为10的书
    Book.objects.filter().excute(publish__in=[10, 20])  // 查询出版社不在 [10, 20] 的书

其他常用模糊查询:

    __startswith 以…开头
    __istartswith 以…开头 忽略大小写
    __endswith 以…结尾
    __iendswith 以…结尾,忽略大小写
    __range 在…范围内
    __year 日期字段的年份
    __month 日期字段的月份
    __day 日期字段的日

b、双下划线(__)之多表条件查询

正向查找(条件)之一对一查询

#查询书名为"python"的书的id号
res3=Book.objects.filter(title="python").values("id")
print(res3)

正向查找(条件)之一对多查询

#查询书名为"python"的书对应的出版社的地址
res4=Book.objects.filter(title="python").values("publisher__city")
print(res4)
 
#查询"aaa"作者所写的所有的书的名字
res5=Book.objects.filter(author__name="aaa").values("title")
print(res5)
 
#查询"aaa"作者所写的所有的书的名字(与上面的用法没区别)
res6=Book.objects.filter(author__name="aaa").values("title")
print(res6)

反向查找之一对多查询

#查询出版了书名为"python"这本书的出版社的名字
res7=Publisher.objects.filter(book__title="python").values("name")
print(res7)
 
#查询写了书名为"python"的作者的名字
res8=Publisher.objects.filter(book__title="python").values("book__authors")
print(res8)

反向查找之多对多查询

#查询所写的书名为"python"的作者的名字
res9=Author.objects.filter(bool__title="python").values("name")
print(res9)
条件查询即与对象查询对应,是指filter,values等方法中的通过__来明确查询条件

4.3F查询和Q查询

F查询专门取对象中某列值的操作,F的作用:用来批量修改数据的

#导入F
from django.db.models import F
#把table1表中的num列中的每一个值在的基础上加10
table1.objects.all().update(num=F("num")+10)

Q构建搜索条件, Q的作用:Q是用来做条件查询的

#导入Q
from django.db.models import Q
 
Q对象可以对关键字参数进行封装,从而更好的应用多个查询
#查询table2表中以"aaa"开头的所有的title列
q1=table2.objects.filter(Q(title__startswith="aaa")).all()
print(q1)

Q对象可以组合使用&,|操作符,当一个操作符是用于两个Q对象时,会产生一个新的Q对象

#查找以"aaa"开头,或者以"bbb"结尾的所有title
Q(title__startswith="aaa") | Q(title__endswith="bbb")

Q对象可以用"~"操作符放在表达式前面表示否定,也可允许否定与不否定形式的组合

#查找以"aaa"开头,且不以"bbb"结尾的所有title
Q(title__startswith="aaa") & ~Q(title__endswith="bbb")

Q对象可以与关键字参数查询一起使用,Q对象放在关键字查询参数的前面

查询条件:

#查找以"aaa"开头,以"bbb"结尾的title且书的id号大于4的记录
Q(title__startswith="aaa") | Q(title__endswith="bbb"),book_id__gt=4
关联查询:
1、如果filter中的条件不是当前的模型类字段,而是关联的模型字段做条件时,
需要在字段名前多加 关联的模型名小写__(双下划线)

#多查一(一.object.filter(多的模型名小写__多的模型的属性值=值))
BookInfo.object.filter(heroinfo__name="郭靖")#查询哪本书有郭靖这个人物
BookInfo.object.filter(heroinfo__name__contains="靖")#查询哪本书的人物名字中含有靖字
2、当模型中有外键时写 关联的外键,没有外键写 关联的模型名小写__(双下划线)

#HeroInfo.object.filter(bookinfo__id=1)#查询书id为1的所有英雄
#一查多(多.object.filter(外键(一的模型名小写)__一的模型的属性值=值))
HeroInfo.object.filter(hbook__id=1)#查询书id为1的所有英雄
 





 
 
 

 



posted on 2021-04-24 20:41  炙热的阳光  阅读(40)  评论(0编辑  收藏  举报