Django ORM 查詢


基本查詢

    # 基本的查詢
    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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM