python框架-Django-02-相知.模型

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()返回的是一个整数,表示影响记录的条数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值