1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python框架-Django-02-相知.模型

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

时间:2020-04-10 03:59:21

相关推荐

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 = btitleb.bpub_date = bpub_dateb.bread = 0b.bcommet = 0b.isDelete = 0return 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.btitlebooks1 = models.Manager()books2 = BookInfoManager()@classmethoddef create(cls,btitle,bpub_date):b = BookInfo()b.btitle = btitleb.bpub_date = bpub_dateb.bread = 0b.bcommet = 0b.isDelete = 0return bclass 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 = btitleb.bpub_date = bpub_dateb.bread = 0b.bcommet = 0b.isDelete = 0return 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.包含:containsEx:BookInfo.books1.filter(btitle__contains='人')Out[23]: <QuerySet [<BookInfo: 人名的名义>]>3.开头/结尾:startswith/endswithEx:<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,SumBookInfo.books1.aggregate(Sum('id'))Out[35]: {'id__sum': Decimal('6')}注:count就不要用聚合了,直接count()2.F对象:比较同一个表中不同域的大小关系ex:from django.db.models import Max,Min,F,QBookInfo.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>]>

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。