Django框架(七):Django模型系統(tǒng) ② 常用查詢及表關(guān)系的實(shí)現(xiàn)

1.常用查詢

每一個(gè)Django模型類,都有一個(gè)默認(rèn)的管理器objects
QuerySet表示數(shù)據(jù)庫(kù)中對(duì)象的列表,他可以有0到多個(gè)過濾器,過濾器通過給定的參數(shù)縮小查詢范圍坑雅。
QuerySet等同于select語句,過濾器是一個(gè)限制字句衬横,比如where裹粤,比如limit。

  • all() 獲取所有
In [1]: from teacher.models import Students   
In [2]: Students.objects.all()
Out[2]: <QuerySet [<Students: 小米>, <Students: 小明>, <Students: 小李>]>  ##返回的是QuerySet
  • 獲取第一條
In [3]: Students.objects.first() 
Out[3]: <Students: 小米>    #返回的是對(duì)象
  • 獲取最后一條
In [4]: Students.objects.last()
Out[4]: <Students: 小李>
  • get(**kwargs)根據(jù)給定的條件獲取一個(gè)對(duì)象蜂林,如果符合多個(gè)遥诉,或者沒有就會(huì)報(bào)錯(cuò)
In [5]: Students.objects.get(pk=1)
Out[5]: <Students: 小米>
  • filter(**kwargs)過濾,根據(jù)參數(shù)提供的條件噪叙,獲取一個(gè)過濾器后的QuerySet矮锈,多個(gè)條件等于 select 語句使用and連接
In [17]: Students.objects.filter(name='小明').first()                                      
Out[17]: <Students: 小明>
  • exclude()排除,作用和filter()相反
In [19]: Students.objects.exclude(pk=1)                                              
Out[19]: <QuerySet [<Students: 小明>, <Students: 小李>]>
  • get_or_create() 有則獲取睁蕾,無則創(chuàng)建苞笨,返回一個(gè)由(object, created)組成的元組,元組中的object 是一個(gè)查詢到的或者是被創(chuàng)建的對(duì)象子眶, created 是一個(gè)表示是否創(chuàng)建了新的對(duì)象的布爾值瀑凝。
    get_or_create() 函數(shù)的詳細(xì)介紹 https://www.cnblogs.com/zhongbokun/p/9732698.html

排序

  • order_by(*fields),根據(jù)給定的字段排序
In [20]: Students.objects.all().order_by('name')     #根據(jù)name字段正序排序                                     
Out[20]: <QuerySet [<Students: 小明>, <Students: 小李>, <Students: 小米>]>
In [21]: Students.objects.all().order_by('name','-age')      #根據(jù)age反序排序             
Out[21]: <QuerySet [<Students: 小明>, <Students: 小李>, <Students: 小米>]>
  • 切片:使用列表的切片語法操作QuerySet壹店,除了不能負(fù)索引猜丹,其他的都可以芝加,他等價(jià)于select語句里面的LIMITOFFSET字句
In [24]: Students.objects.all().order_by('name')[::-1]                                         
Out[24]: [<Students: 小米>, <Students: 小李>, <Students: 小明>]

限制字段查詢

  • values(*fields)返回QuerySet,這個(gè)QuerySet返回的是一個(gè)字典列表硅卢。參數(shù)fields指定了select中我們想要限制查詢的字段。返回的字典列表 中藏杖,只會(huì)包含我們指定的字段将塑,如果不指定殷蛇,包含所有字段登馒。
In [25]: Students.objects.values('name')                                                       
Out[25]: <QuerySet [{'name': '小米'}, {'name': '小明'}, {'name': '小李'}]>

In [26]: print(Students.objects.values('name').query)                                                              
SELECT `teacher_students`.`name` FROM `teacher_students`
  • only(*fields)返回一個(gè) QuerySet,跟values一樣场钉,不同的是這個(gè)QuerySet是對(duì)象列表来吩,only一定包含主鍵敢辩。
In [27]: Students.objects.only('name')                                                           
Out[27]: <QuerySet [<Students: 小米>, <Students: 小明>, <Students: 小李>]>
  • defer(*fields)用法與only相反

多條件OR連接

需要使用or條件蔽莱,我嗎要使用到Q對(duì)象

In [28]: from django.db.models import Q    #導(dǎo)入Q模塊

In [29]: Students.objects.filter(Q(name='小米')|Q(name='小明'))                  
Out[29]: <QuerySet [<Students: 小米>, <Students: 小明>]>

查詢條件

相當(dāng)于是SQL語句中的where語句后面的條件,語法為字段名__規(guī)則

In [30]: Students.objects.filter(name__exact='小米')    # 等同于namet='小米'     
Out[30]: <QuerySet [<Students: 小米>]>
  • exact - 精確匹配
  • iexact - 忽略大小寫
  • contains - 模糊匹配戚长,等同于%條件%
  • icontains - 大小寫不敏感模糊匹配
  • in - 字段名__規(guī)則=列表 只要條件在列表中都匹配
  • gt - 大于
  • gte - 大于等于
  • lt - 小于
  • lte - 小于等于
  • startwith - 以什么條件開始
  • istartwith - 以什么條件開始盗冷,忽略大小寫
  • endwith - 以什么結(jié)尾
  • iendwith - 以什么結(jié)尾,忽略大小寫
  • range - 范圍區(qū)間
  • isnull - filter(age__isnull=True)字段為空的

聚合函數(shù)

  • count統(tǒng)計(jì)數(shù)量 (嚴(yán)格來說不算聚合函數(shù))
In [31]: Students.objects.all().count()                                                     
Out[31]: 3
  • Avg 計(jì)算平均值
In [32]: from django.db.models import Avg #導(dǎo)入模塊
In [34]: Students.objects.aggregate(age_avg=Avg('age'))                                                                 
Out[34]: {'age_avg': 15.0}
  • Max - 找出最大值
  • Mix - 找出最小值
  • Sum - 計(jì)算求和
分組聚合

分組需要結(jié)合values,annotate和聚合 同廉,方法 看下面的案例
查詢男生女生多少人:

In [35]: from django.db.models import Count  

In [37]: Students.objects.values('sex').annotate(Count('sex'))        
Out[37]: <QuerySet [{'sex': 1, 'sex__count': 3}]>

關(guān)于聚合查詢的詳細(xì)介紹 ==》https://blog.csdn.net/weixin_42134789/article/details/84567365

2.常用模型字段類型

  • int - IntegetField:整型仪糖,映射到數(shù)據(jù)庫(kù)中的int類型
  • varchar - CharField : 字符類型,映射到數(shù)據(jù)庫(kù)中的varchar類型迫肖,通過max_length指定最大長(zhǎng)度锅劝,max-length為必須參數(shù),否則會(huì)報(bào)錯(cuò)
  • longtext - TextField:文本類型蟆湖,映射到數(shù)據(jù)庫(kù)中的text類型
  • tinyint - 布爾類型故爵,映射到數(shù)據(jù)庫(kù)中的tinyint類型,在使用的時(shí)候隅津,傳遞True/False進(jìn)去稠集。如果要可以為空,則用NullBooleanField
  • date - DateField:日期類型饥瓷,沒有時(shí)間
  • datetime - DateTimeField:日期時(shí)間類型剥纷。映射到數(shù)據(jù)庫(kù)中的是datetime類型,在使用的時(shí)候呢铆,可以設(shè)置DateField.auto_now每次保存對(duì)象時(shí)晦鞋,自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間。設(shè)置DateField.auto_now_add當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間

3.常用模型字段參數(shù)

  • primary_key: 指定是否為主鍵
  • unique: 指定是否唯一棺克。
  • null: 指定是否為空悠垛,默認(rèn)為False。
  • blank: 等于True時(shí)form表單驗(yàn)證時(shí)可以為空娜谊,默認(rèn)為False确买。
  • default: 設(shè)置默認(rèn)值。
  • DateField.auto_now: 每次修改都會(huì)將當(dāng)前時(shí)間更新進(jìn)去纱皆,只有調(diào)用湾趾,QuerySet.update方法將不會(huì)調(diào)用。這個(gè)參數(shù)只是Date和DateTime以及TimModel.save()方法才會(huì)調(diào)用e類才有的派草。
  • DateField.auto_now_add: 第一次添加進(jìn)去搀缠,都會(huì)將當(dāng)前時(shí)間設(shè)置進(jìn)去。以后修改近迁,不會(huì)修改這個(gè)值

4.表關(guān)系實(shí)現(xiàn)

Django中艺普,模型通過特殊的字段進(jìn)行關(guān)系連接

  • 一對(duì)一

from django.db import models

# Create your models here.

class Students (models.Model): # 一個(gè)類代表一個(gè)數(shù)據(jù)表
    id = models.AutoField(primary_key=True) ##創(chuàng)建一個(gè)可以自動(dòng)生成的主鍵,這條也可以不寫,Django中會(huì)自動(dòng)生成主鍵
    name = models.CharField(verbose_name='姓名',max_length=20)   ##創(chuàng)建字符類型字段,最大長(zhǎng)度為20,設(shè)置提示信息'姓名'
                                            ### max_length為CharField的必須參數(shù)
    age = models.SmallIntegerField(verbose_name='年齡',null=True) ##創(chuàng)建值可以為null的小整型字段,
    sex = models.SmallIntegerField(default=1)   ##創(chuàng)建缺省值為1的小整型字段
    qq = models.CharField(max_length=20,null=True)
    phone = models.CharField(max_length=20,null=True)
    c_time = models.DateTimeField(verbose_name='創(chuàng)建時(shí)間',auto_now_add=True)  ##創(chuàng)建日期時(shí)間類型字段,自動(dòng)創(chuàng)建當(dāng)前時(shí)間

    def __str__(self):
        return self.name

class StudentsDetail(models.Model):  #學(xué)生詳情表
    student = models.OneToOneField('Students',on_delete=models.CASCADE) #一對(duì)一關(guān)聯(lián)歧譬,關(guān)聯(lián)Students類,on_delete代表級(jí)聯(lián)岸浑,關(guān)聯(lián)的Students表刪除后自動(dòng)刪除此表
    card_num = models.CharField(verbose_name='身份證號(hào)碼',max_length=20,unique=True,null=True)
    college = models.CharField('畢業(yè)院校',max_length=20,default='家里蹲')
  • 一對(duì)多

from django.db import models

# Create your models here.

class Students (models.Model): # 一個(gè)類代表一個(gè)數(shù)據(jù)表
    id = models.AutoField(primary_key=True) ##創(chuàng)建一個(gè)可以自動(dòng)生成的主鍵,這條也可以不寫瑰步,Django中會(huì)自動(dòng)生成主鍵
    name = models.CharField(verbose_name='姓名',max_length=20)   ##創(chuàng)建字符類型字段,最大長(zhǎng)度為20,設(shè)置提示信息'姓名'
                                            ### max_length為CharField的必須參數(shù)
    age = models.SmallIntegerField(verbose_name='年齡',null=True) ##創(chuàng)建值可以為null的小整型字段,
    sex = models.SmallIntegerField(default=1)   ##創(chuàng)建缺省值為1的小整型字段
    qq = models.CharField(max_length=20,null=True)
    phone = models.CharField(max_length=20,null=True)
    c_time = models.DateTimeField(verbose_name='創(chuàng)建時(shí)間',auto_now_add=True)  ##創(chuàng)建日期時(shí)間類型字段,自動(dòng)創(chuàng)建當(dāng)前時(shí)間
    grade = models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True) #一對(duì)多關(guān)聯(lián)助琐,外鍵關(guān)聯(lián)Grade班級(jí)表,models.SET_NULL設(shè)置班級(jí)表刪除后面氓,此字段自動(dòng)為NULL

    def __str__(self):
        return self.name

class StudentsDetail(models.Model):
    student = models.OneToOneField('Students',on_delete=models.CASCADE) #一對(duì)一關(guān)聯(lián)兵钮,關(guān)聯(lián)Students類,on_delete代表級(jí)聯(lián),關(guān)聯(lián)的Students表刪除后自動(dòng)刪除此表
    card_num = models.CharField(verbose_name='身份證號(hào)碼',max_length=20,unique=True,null=True)
    college = models.CharField('畢業(yè)院校',max_length=20,default='家里蹲')

class Grade(models.Model):
    name = models.CharField('班級(jí)名稱',max_length=20,)
    num = models.CharField('班期',max_length=20)
  • 多對(duì)多

from django.db import models

# Create your models here.

class Students (models.Model): # 一個(gè)類代表一個(gè)數(shù)據(jù)表
    id = models.AutoField(primary_key=True) ##創(chuàng)建一個(gè)可以自動(dòng)生成的主鍵舌界,這條也可以不寫掘譬,Django中會(huì)自動(dòng)生成主鍵
    name = models.CharField(verbose_name='姓名',max_length=20)   ##創(chuàng)建字符類型字段,最大長(zhǎng)度為20,設(shè)置提示信息'姓名'
                                            ### max_length為CharField的必須參數(shù)
    age = models.SmallIntegerField(verbose_name='年齡',null=True) ##創(chuàng)建值可以為null的小整型字段,
    sex = models.SmallIntegerField(default=1)   ##創(chuàng)建缺省值為1的小整型字段
    qq = models.CharField(max_length=20,null=True)
    phone = models.CharField(max_length=20,null=True)
    c_time = models.DateTimeField(verbose_name='創(chuàng)建時(shí)間',auto_now_add=True)  ##創(chuàng)建日期時(shí)間類型字段,自動(dòng)創(chuàng)建當(dāng)前時(shí)間
    grade = models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True) #一對(duì)多關(guān)聯(lián),外鍵關(guān)聯(lián)Grade班級(jí)表呻拌,models.SET_NULL設(shè)置班級(jí)表刪除后葱轩,此字段自動(dòng)為NULL

    def __str__(self):
        return self.name

class StudentsDetail(models.Model):
    student = models.OneToOneField('Students',on_delete=models.CASCADE) #一對(duì)一關(guān)聯(lián),關(guān)聯(lián)Students類,on_delete代表級(jí)聯(lián)藐握,關(guān)聯(lián)的Students表刪除后自動(dòng)刪除此表
    card_num = models.CharField(verbose_name='身份證號(hào)碼',max_length=20,unique=True,null=True)
    college = models.CharField('畢業(yè)院校',max_length=20,default='家里蹲')

class Grade(models.Model):
    name = models.CharField('班級(jí)名稱',max_length=20,)
    num = models.CharField('班期',max_length=20)

class Course(models.Model):
    name = models.CharField('課程名稱',max_length=20)
    #student = models.ManyToManyField('Students') #多對(duì)多關(guān)聯(lián)靴拱,默認(rèn)會(huì)創(chuàng)建一張中間表,當(dāng)你需要中間表中添加額外字段,最好指定一張中間表
    student = models.ManyToManyField('Students',through='Enroll') #多對(duì)多關(guān)聯(lián)猾普,指定Enroll表為中間表

class Enroll(models.Model):  #多對(duì)多的中間表袜炕,等于一張報(bào)名表
    student = models.ForeignKey('Students',on_delete=models.CASCADE) #外鍵關(guān)聯(lián)學(xué)生表
    course = models.ForeignKey('Course',on_delete=models.CASCADE) #外鍵關(guān)聯(lián)課程表
    c_time = models.DateTimeField(auto_now_add=True)
    paid = models.FloatField('付款',default=0)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市初家,隨后出現(xiàn)的幾起案子偎窘,更是在濱河造成了極大的恐慌,老刑警劉巖溜在,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陌知,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掖肋,警方通過查閱死者的電腦和手機(jī)仆葡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來志笼,“玉大人沿盅,你說我怎么就攤上這事∽淹螅” “怎么了嗡呼?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵纸俭,是天一觀的道長(zhǎng)皇耗。 經(jīng)常有香客問我,道長(zhǎng)揍很,這世上最難降的妖魔是什么郎楼? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任万伤,我火速辦了婚禮,結(jié)果婚禮上呜袁,老公的妹妹穿的比我還像新娘敌买。我一直安慰自己,他們只是感情好阶界,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布虹钮。 她就那樣靜靜地躺著,像睡著了一般膘融。 火紅的嫁衣襯著肌膚如雪芙粱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天氧映,我揣著相機(jī)與錄音春畔,去河邊找鬼。 笑死岛都,一個(gè)胖子當(dāng)著我的面吹牛律姨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臼疫,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼择份,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了烫堤?” 一聲冷哼從身側(cè)響起缓淹,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塔逃,沒想到半個(gè)月后讯壶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湾盗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年伏蚊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片格粪。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躏吊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出比伏,到底是詐尸還是另有隱情,我是刑警寧澤疆导,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響舰攒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悔醋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一摩窃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芬骄,春花似錦猾愿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宰僧。三九已至材彪,卻和暖如春琴儿,著一層夾襖步出監(jiān)牢的瞬間段化,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工造成, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留显熏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓晒屎,卻偏偏與公主長(zhǎng)得像喘蟆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鼓鲁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容