生活随笔
收集整理的這篇文章主要介紹了
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>]>
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()返回的是一個整數,表示影響記錄的條數
總結
以上是生活随笔為你收集整理的python框架-Django-02-相知.模型的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。