Django 模型(二)增删改查

2016/05/08 Django 阅读次数:

增删改查

list=BookInfo.objects.filter(id=1) //查询id=1的数据

list = BookInfo.objects.filter(btitle__contains='传') //查询是否包含'传'

startswith、endswith:以指定值开头或结尾。
例:查询书名以'部'结尾的图书
list = BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

isnull: 判断不为空

list = BookInfo.objects.filter(btitle__isnull=False)

in:是否包含在范围内。

list = BookInfo.objects.filter(id__in=[1, 3, 5])

比较查询

gt、gte、lt、lte:大于、大于等于、小于、小于等于。

例:查询编号大于3的图书

list = BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

list = BookInfo.objects.exclude(id=3)

日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询1980年发表的图书。

list = BookInfo.objects.filter(bpub_date__year=1980)

例:查询1980年1月1日后发表的图书。

list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

F对象:

作用:用于类属性之间的比较。
使用之前需要先导入:
from django.db.models import F
例:查询图书阅读量大于评论量图书信息。
BookInfo.objects.filter(bread__gt=F('bcomment'))
例:查询图书阅读量大于2倍评论量图书信息。
BookInfo.objects.filter(bread__gt=F('bcomment')*2)

Q对象:

作用:用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作
使用之前需要先导入:
from django.db.models import Q
例:查询id大于3且阅读量大于30的图书的信息。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
例:查询id大于3或者阅读量大于30的图书的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
例:查询id不等于3图书的信息。
BookInfo.objects.filter(~Q(id=3))

聚合函数:

作用:对查询结果进行聚合操作。
sum count avg max min
aggregate调用这个函数来使用聚合 返回值是一个字典
使用前需先导入聚合类
from django.db.models import Sum,Count,Max,Min,Avg
查询所有图书的数目
BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}
查询所有图书阅读量的总和
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}
count函数 返回值是一个数字
作用统计满足条件数据的数目
统计所有图书的数目
BookInfo.objects.all().count()
BookInfo.objects.count()
统计id大于3的所有图书的数目
BookInfo.objects.filter(id__gt=3).count()

查询集:

all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。

查询集特性:

1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,
使用的是缓存中的结果。

限制查询集

可以对一个查询集进行取下标或者切片操作来限制查询集的结果。

对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

取出查询集第一条数据的两种方式:

方式 说明
b[0] 如果b[0]不存在,会抛出IndexError异常
b[0:1].get() 如果b[0:1].get()不存在,会抛出DoesNotExist异常。

exists:判断一个查询集中是否有数据。True False

数据库查询操作:

filter 过滤条件,exclude 相反的过滤

# 查询前5条数据

persons = Person.objects.all()[:5]

# print(persons)

# 查询person_name字段包含F的数据

persons = Person.objects.filter(person_name__contains='F')

# print(persons)

# 查询大于id大于90的数据

persons = Person.objects.filter(pk__gt=90)

# print(persons)

# 查询id不大于90的数据

persons = Person.objects.exclude(pk__gt=90)

# print(persons)

# 查询包含【4,7,9]数据

persons =Person.objects.filter(pk__in=[4,7,9])

# print(persons)

# 查询收入大于50的数据

persons = Person.objects.filter(person_money__gt=50)

# for person in persons:

# print(person.id,person.person_name,person.person_money)

# 查询收入大于年龄的数据

persons = Person.objects.filter(person_money=F('person_age'))

# for person in persons:

# print(person.person_age,person.person_money)

# 查询收入大于60,年龄大于50

persons = Person.objects.filter(person_money__gt=60,person_age__gt=50)

# for person in persons:

# print(person.person_age,person.person_money)

# 查询年龄大于50 或者收入大于60的所有数据

persons = Person.objects.filter(Q(person_age__gt=50) | Q(person_money__gt=60))

# for person in persons:

# print(person.person_age,person.person_money)

# 查询收入大于60且年龄大于50

persons = Person.objects.filter(Q(person_age__gt=50) & Q(person_money__gt=60))

for person in persons:

print(person.person_age,person.person_money)

Search

    Table of Contents