ex:
from django.db import models
'''
功能:
1.创建表
2.提供模型类,用于上层进行crud操作
'''
# Create your models here.
#需要继承该类,才能完成ORM
'''
#自定义管理器
*1.更改默认查询集的查询结果
*2.快速插入
'''
class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager,self).get_queryset().filter(isDelete=0)
def create(self,btitle,bpub_date):
b = BookInfo()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcommet = 0
b.isDelete = 0
return b
'''
@attention: 这里的create方法是用于快速插入的。
'''
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateTimeField(db_column='pub_date')
bread = models.IntegerField(default=0)
bcommet = models.IntegerField(default=0)
isDelete = models.BooleanField(default=0)
class Meta():
db_table = 'bookinfo'
#BookInfo.objects.all()的返回值:
def __str__(self):
return self.btitle
books1 = models.Manager()
books2 = BookInfoManager()
@classmethod
def create(cls,btitle,bpub_date):
b = BookInfo()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcommet = 0
b.isDelete = 0
return b
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField(default=0)
hcontent = models.CharField(max_length=1000)
isDelete = models.BooleanField(default=0)
#引用外键,重点记忆
hbook = models.ForeignKey(BookInfo)
class Meta():
db_table = 'heroinfo'
#def __str__(self):
# return self.hname
我把整个models拿过来进行如下说明:
1.定义模型类时后一定要集成models.Model:
ex:
class demo(models.Model):
2.字段类型的说明:
models.CharField(max_length=20) #定义字符最大长度
models.DateTimeField(db_column='pub_date') #定义该域在数据库的名字
models.IntegerField(default=0) #默认值
models.BooleanField(default=0) #默认值
注:如果需要更改表结构,要做迁移。迁移里面有文件可能会报迁移不成功。
3.元选项
在定义的模型类中继续定义类,这个类的名字就是这个,不能变
clasee Meta():
db_table='bookinfo' #定义表的名字
ording = ['id','name'] #按照域排序
ording = ['-id'] #降序
4.自定义管理器
作用有二:
1.自定义查询集
2.快速插入
经常访问的BookInfo.objescts.all(),这里的objects就是默认的管理器,可以通过继承它,构造自定义的管理器
ex:
#定义管理器类
class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager,self).get_queryset().filter(isDelete=0)
def create(self,btitle,bpub_date):
b = BookInfo()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcommet = 0
b.isDelete = 0
return b
在BookInfo类中加入如下语句:
books1 = models.Manager()
books2 = BookInfoManager()
这样我们就可以使用BookInfo.books1/books2.all()访问数据。
注:管理器是模型类的属性,用于将对象与数据库数据表映射。每个模型类中至少有一个管理器。
5.查询
#返回集合的方法:
all() #获取所有数据
filter() #表示筛选的查询
exclude() #与filter()相对,不满足条件的数据。
order_by()
values() 对象的值,以对象-字典 最后构成列表的方式返回数据本身。
#返回单个值的方法:
get() #括号中可加条件,没有的话报Doesnotexist异常
count()
first() #括号中可加条件
last() #括号中可加条件
exists() #不加参数
#限制查询集
ex:
BookInfo.books1.all()[0:5]
注:不能为负
#查询集缓存
惰性查询:不迭代的话,不会去数据库拿数据。
ex:
res = BookInfo.books1.all()
for each in res[0:10]:
do something
等我再去for each in res[0:10]的时候,他已经给你缓存好了。
什么情况不缓存:
ex:
res = BookInfo.books1.all()
for each in res[0:10]:
do something
我再去:for each in res[15:20]时,重新去查询数据库,但不会被缓存。
#字段查询
1.相等:exact,一般省略不写
Ex:
<QuerySet [<BookInfo: 风云>, <BookInfo: 天龙八部1>]>
BookInfo.books1.filter(isDelete__exact=0)
Out[22]:
<QuerySet [<BookInfo: 风云>, <BookInfo: 天龙八部1>]>
2.包含:contains
Ex:
BookInfo.books1.filter(btitle__contains='人')
Out[23]:
<QuerySet [<BookInfo: 人名的名义>]>
3.开头/结尾:startswith/endswith
Ex:
<QuerySet [<BookInfo: 人名的名义>]>
BookInfo.books1.filter(btitle__endswith='人')
Out[25]:
<QuerySet []>
BookInfo.books1.filter(btitle__endswith='云')
Out[26]:
<QuerySet [<BookInfo: 风云>]>
4.关联查询:相当于inner join,这个比较高端
Ex:
BookInfo.books1.filter(heroinfo__hname__contains='聂风')
Out[27]:
<QuerySet [<BookInfo: 风云>]>
说明:查询的结果是关联外键的name域包含’聂风‘的书。
#聚合/F/Q对象
1.聚合函数:
Sum(),Max(),Min(),Avg(),Count()
ex:
BookInfo.books1.aggregate(Max('id'))
Out[32]:
{'id__max': 3}
BookInfo.books1.aggregate(Min('id'))
Out[33]:
{'id__min': 1}
from django.db.models import Max,Min,Sum
BookInfo.books1.aggregate(Sum('id'))
Out[35]:
{'id__sum': Decimal('6')}
注:count就不要用聚合了,直接count()
2.F对象:
比较同一个表中不同域的大小关系
ex:
from django.db.models import Max,Min,F,Q
BookInfo.books1.filter(id__gte=F('bread'))
Out[39]:
<QuerySet [<BookInfo: 人名的名义>, <BookInfo: 天龙八部1>]>
BookInfo.books1.filter(pk__gte=F('bread'))
Out[40]:
<QuerySet [<BookInfo: 人名的名义>, <BookInfo: 天龙八部1>]>
3.与/或关系:
与
ex:
<QuerySet [<BookInfo: 人名的名义>, <BookInfo: 天龙八部1>]>
BookInfo.books1.filter(id__gte=2,btitle__contains='天')
Out[46]:
<QuerySet [<BookInfo: 天龙八部1>]>
或语法格式如下:
ex:
BookInfo.books1.filter(Q(id__gte=2)|Q(btitle__contains='风'))
Out[48]:
<QuerySet [<BookInfo: 风云>, <BookInfo: 人名的名义>, <BookInfo: 天龙八部1>]>
2019/03/26
一些补充
一、django
1.django values()和value_list()区别
vlaues -
单条记录 - <class 'dict'>
多条记录 - <class 'django.db.models.query.QuerySet'>
vlaues_list -
单条记录 - <class 'tuple'>
多条记录 - <class 'django.db.models.query.QuerySet'>
vlaues_list 返回的是元组列表,默认flat=False,设置flat=True,就是咱们需要的列表格式了。
上面的flat=True,是以值的数据结构返回,所有注定了flat=True的时候只能指定返回单个字段,如果传递多个字段会出错
2.django 查询
#只记录不常用的,实用的
reverse():倒序
distinct():去重(只要结果里面有重复的)
3.django 更新
第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是QuerySet对象;
模型的save()方法,会更新一行里的所有列,而某些情况下,我们只需要更新行里的某几列; #速度慢
update()返回的是一个整数,表示影响记录的条数