基本查詢
# 基本的查詢 res = models.Student.objects.all().first() print(res) # 返回的是QuerySet 列表中套對象 res = models.Student.objects.values("name").first() print(res) # 返回的是QuerySet 列表中套字典 res = models.Student.objects.values_list("name") print(res) # 返回的是QuerySet 列表中套元組 # 當然,這寫查詢后面都可以跟上.first()取列表中的第一個
高級查詢
# 高級查詢 # 1. in 通過 字段名__in = [1,2] 查詢 res = models.Student.objects.filter(age__in=[12,14,42]).all() # 2. not in 通過exclude(字段名__in = [1,2]) exclude就是除了的意思 res = models.Student.objects.exclude(age__in=[12,14,42]).all() # 3. like 通配查詢 # where name like "李%" # 代表查詢名字以李開頭的所有 # name__istartswith 表示不區分大小寫,以什么什么為開頭 res = models.Student.objects.filter(name__startswith="李").all()
# where name like "%白" # 表示匹配以白結尾的所有單詞 # name__iendswith 表示不區分大小寫,以什么什么為結尾 res = models.Student.objects.filter(name__endswith="白").all()
# where name like "%小%" 表示匹配中間有 小 字的所有單詞 # name__icontains 表示不區分大小寫,包含什么什么的單詞 res = models.Student.objects.filter(name__contains="小").all() # 4. between .. and... 通過 列名__range = [開始位置,結束位置] 閉區間 res = models.Student.objects.filter(id__range=[2,5]).all() # 5. limit 通過索引進行切片[10:20] 代表從10取到20 前閉后開 res = models.Student.objects.all()[5:7] # 6. order by 通過order by 方法, 前面加"-"就是降序,默認升序 res = models.Student.objects.order_by("id").all()
# 可以多次排序 先按age字段降序,如果age相同,就按id字段升序 res = models.Student.objects.order_by("-age","id").all() # 7. group by # 分組需要用到django中的方法 from django.db.models import Count, Max, Min, Sum res = models.Student.objects.values("name").annotate(xxx=Count("id")) # 表示的是搜索name字段和對表的id字段計算count,並起了別名為xxx 通過name字段進行分組
# SELECT "app01_student"."name", COUNT("app01_student"."id") AS "xxx" FROM "app01_student" GROUP BY "app01_student"."name" # 8. only 只取某列的值 res = models.Student.objects.only("name","age").all() # 取出來是QuerySet 列表里面包含對象,對象中包含name字段的值以及id列的值 # 和values取值的區別就是only取出來的是列表套對象,values取的是列表套字典 # 並且,不管你only中是否包含id字段,他都會把你的id字段一並取出來 # 9. defer 取出除了某列以外其他列的值 res = models.Student.objects.defer("id","name").all() # 取出來的也是列表套對象,並且,不管你里面有沒有id字段,都會把你id列的值取出來 # 10. using # 我們在配置數據庫時,會把數據庫添加到DATABASES 中 # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } # 如果里面連有多個數據庫,就可以通過using來確定使用哪一個數據庫 res = models.Student.objects.all().using("default") # 11. 查詢表中一共有多少條數據 res = models.Student.objects.count() # 12. 第一條數據 res = models.Student.objects.first() # 13. 最后一條數據 res = models.Student.objects.last() # 14. gt 大於 lt 小於 gte 大於等於 lte 小於等於 res = models.Student.objects.filter(id__gt=8).all()
res = models.Student.objects.filter(id__lte=8).all() # 15. and 操作 , 在filter中用逗號隔開就是and res = models.Student.objects.filter(id=2,age=23) # 返回的還是QuerySet 類型 # 16. or 操作 # or 需要從django中導入Q方法 from django.db.models import Q res = models.Student.objects.filter(Q(id=2) | Q(age=12))
res = models.Student.objects.filter(Q(Q(id=2) | Q(age=12)) & Q(name="李鐵柱")) # | 表示 或 & 表示 與 # 17. 在原有的基礎上更新,比如我想讓某一列的值整體 + 1 # 需要從django中導入F方法 from django.db.models import F models.Student.objects.update(F("age") + 1) # 這樣age字段就會全部 + 1 # 18. 原生sql語句 # django也給我們提供了寫原生sql的方法 from django.db import connection # 導入連接 cursor = connection.cursor() # 生成cursor對象 cursor.execute() # 可以提交sql語句,也可以傳參數 cursor.fetchall() # 拿取所有的結果 cursor.fetchone() # 拿取一條結果 models.Student.objects.raw() # 這個方法也可以提交sql語句,不建議使用
增和刪的一些補充
# 增 # 一次增加一條數據 models.Student.objects.create(name="xxx",age=12) # 一次增加多條數據 obj = [ models.Student(name="qqq",age=12), models.Student(name="aaa",age=32), models.Student(name="www",age=21) ] models.Student.objects.bulk_create(obj) # 刪除 models.Student.objects.filter(name="xxx").delete() # 如果是單表刪除沒有問題,但如果這張表的主鍵和別的表建立了外鍵關系,刪除這條數據,另一張表對應的數據也會被刪除掉 # 這也稱為級聯刪除,如果我們不需要這樣,可以在建外鍵是給on_delete賦值 # on_delete 幾個參數的含義 # CASCADE 默認值 級聯刪除 # SET_NULL 取消級聯刪除,如果被關聯外鍵的一條數據刪除,關聯的對應值用NULL代替,所以需要支持NULL # SET_DEFAULT 取消級聯刪除,被刪除就用默認值代替 class Student(models.Model): name = models.CharField(max_length=32) teac = models.ForeignKey('Teacher', null=True, on_delete=models.SET_NULL)