常用查詢和表關係的實現(示例)

模型二 – 常用查詢和表關係的實現

一:字段類型+參數

字段類型:https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types

字段參數:https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-options常用查詢

二:常用查詢

# get all filter

# all
In [8]: Student.objects.all()                                                                                         
Out[8]: <QuerySet [<Student: Lucy>, <Student: lucy>, <Student: 趙小瑋>, <Student: 李國林>, <Student: lily>]>

# filter
In [10]: res = Student.objects.filter(name="lily")                                                                       
In [11]: print(res.query)                                                                                                
SELECT `teacher_student`.`num`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`height`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time`, `teacher_student`.`x_time` FROM `teacher_student` WHERE `teacher_student`.`name` = lily

# get
In [12]: Student.objects.get(name="lily")                                                                               
Out[12]: <Student: lily>

共同點:

都是通過objects去實現的----》objects:每個django模型類,都有一個默認的管理器,objects

查詢方法:
In [13]: Student.objects.first()   # 查詢第一條數據                                                                                 
Out[13]: <Student: Lucy>	# 返回一個對象     

In [14]: Student.objects.last()   # 查詢最後一條數據                                                                                        
Out[14]: <Student: lily>	# 返回一個對象   

In [15]: Student.objects.filter(name="lily")                                                                             
Out[15]: <QuerySet [<Student: lily>]>

In [16]: Student.objects.exclude(name="lily")  # 與filter用法相同,作用相反,排除的意思                                                                          
Out[16]: <QuerySet [<Student: Lucy>, <Student: lucy>, <Student: 趙小瑋>, <Student: 李國林>]>

In [19]: Student.objects.values('name')   # 指定字段查詢:只能拿到指定查詢的字段值,其他的無法獲取                                                                               
Out[19]: <QuerySet [{'name': 'Lucy'}, {'name': 'lucy'}, {'name': '趙小瑋'}, {'name': '李國林'}, {'name': 'lily'}]>

In [20]: res = Student.objects.values('name')                                                                            

In [21]: res[2]['name']                                                                                                  
Out[21]: '趙小瑋'

# only :指定字段查詢,但是可以獲取其他所有字段值
In [26]: res = Student.objects.only('name')                                                                              

In [27]: res                                                                                                             
Out[27]: <QuerySet [<Student: Lucy>, <Student: lucy>, <Student: 趙小瑋>, <Student: 李國林>, <Student: lily>]>

In [28]: res[2].name                                                                                                     
Out[28]: '趙小瑋'

In [29]: res[2].sex                                                                                                      
Out[29]: 1

# defer:和only相反
# order_by:根據指定字段排序
In [34]: res = Student.objects.order_by('age')                                                                           

In [35]: print(res.query)                                                                                                
SELECT `teacher_student`.`num`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`height`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time`, `teacher_student`.`x_time` FROM `teacher_student` ORDER BY `teacher_student`.`age` ASC

In [36]: res                                                                                                             
Out[36]: <QuerySet [<Student: Lucy>, <Student: lucy>, <Student: lily>, <Student: 李國林>, <Student: 趙小瑋>]>

In [37]: res = Student.objects.order_by('-age')                                                                          

In [38]: print(res.query)                                                                                                
SELECT `teacher_student`.`num`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`height`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time`, `teacher_student`.`x_time` FROM `teacher_student` ORDER BY `teacher_student`.`age` DESC

In [39]: res                                                                                                             
Out[39]: <QuerySet [<Student: 趙小瑋>, <Student: 李國林>, <Student: lily>, <Student: lucy>, <Student: Lucy>]>



# 多條件查詢
In [42]: Student.objects.filter(age=18,sex=0)                                                                            
Out[42]: <QuerySet [<Student: lily>]>

In [43]: from django.db.models import Q                                                                                  

In [44]: Student.objects.filter(Q(sex=0),Q(age=18)|Q(age=12))                                                            
Out[44]: <QuerySet [<Student: Lucy>, <Student: lily>]>

查詢條件
# exact:準確匹配
.....WHERE `teacher_student`.`name` = lucy

# iexact:不區分大小寫匹配
 .....WHERE `teacher_student`.`name` LIKE lucy

# contains:包含匹配
..... WHERE `teacher_student`.`name` LIKE BINARY %l%

# icontains:不區分大小寫包含匹配
......WHERE `teacher_student`.`name` LIKE %L%
# in:指定值
Student.objects.filter(sex__in='01')  
Student.objects.filter(pk__in=[1,3,5]) 

# 子查詢
res = Student.objects.filter(name__icontains='l').only("name")   
res1 = Student.objects.filter(pk__in=res).only("name")  
SELECT `teacher_student`.`num`, `teacher_student`.`name` FROM `teacher_student` WHERE `teacher_student`.`num` IN (SELECT U0.`num` FROM `teacher_student` U0 WHERE U0.`name` LIKE %l%)
 
# gt 大於 gte大於等於 lt小於 lte小於等於
Student.objects.filter(pk__gt=2)  
# 範圍查詢
 res = Student.objects.filter(age__range=(18, 30)) 
 
 # annotate: 分組
 In [66]: res = Student.objects.values('sex').annotate(ren=Count('sex'))  # 聚合分組                                                

In [67]: print(res.query)                                                                                                
SELECT `teacher_student`.`sex`, COUNT(`teacher_student`.`sex`) AS `ren` FROM `teacher_student` GROUP BY `teacher_student`.`sex` ORDER BY NULL

表關係的實現

[外鏈圖片轉存失敗(img-8r57FIlx-1568823354187)(assets/1568297428830.png)]

1.表關係

from django.db import models


# Create your models here.
class Student(models.Model):
    name = models.CharField('姓名', max_length=20)
    age = models.SmallIntegerField('年齡', null=True)
    sex = models.SmallIntegerField('性別', default=1)
    qq = models.CharField('QQ', max_length=20, unique=True)
    phone = models.CharField('電話', max_length=20, unique=True)
    c_time = models.DateTimeField('創建時間', auto_now_add=True)
    # detail = models.OneToOneField('StudentDetail', on_delete=models.SET_NULL, null=True)
    grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return "{}-{}".format(self.name, self.age)


class StudentDetail(models.Model):
    college = models.CharField('學院', max_length=20)
    student = models.OneToOneField('Student', on_delete=models.CASCADE)


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


class Course(models.Model):
    name = models.CharField("課程名稱", max_length=20)
    students = models.ManyToManyField('Student', through='Enroll')


# 中間表
class Enroll(models.Model):
    student = models.ForeignKey('Student', on_delete=models.CASCADE)
    course = models.ForeignKey('Course', on_delete=models.CASCADE)
    pay = models.FloatField('繳費金額', default=0)
    c_time = models.DateTimeField('報名時間', auto_now_add=True)

2.回滾

python manage.py migrate student 0001
注意:回滾後刪除最後一次遷移文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章