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
語句里面的LIMIT
和OFFSET
字句
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)