Django 之 ORM


單表

表結構

常用字段類型

字段 備註
AutoField 自增列, 必須填入 primary_key=True, 如果沒有該列, 會自動創建一個名爲 id 的列
IntegerField 10 位內數字
CharField 字符串類型, 必須填如 manx_length 參數限制長度
DateField YYYY-MM-DD, 相當於 datetime.date()
DateTimeField YYYY-MM-DD HH:MM:[:ss:[.uuuuuu]], 相當於 datetime.datetime()

常用參數

參數 註釋
null 是否允許爲空
unique 是否唯一
db_index 設置爲索引
default 設置默認值
auto_now_add=True 記錄創建時間
auto_now=True 記錄變更時間

創建

class Person(models.Model):
    name = models.CharField(max_length=16) # 姓名, 最大長度爲 16
    age = models.IntegerField(default=18) # 年齡, 默認 18 歲
    phone = models.CharField(max_length=11, unique=True) # 電話, 唯一字段, 最大長度爲 11 位


數據的增刪改查

# 增加新的數據行
models.Publisher.objects.create(name="Gury", age=19, phone="1231231234")


基礎查詢

# 查詢所有數據
models.Person.objects.all()

# 查詢滿足條件的
models.Person.objects.filter(id=1) # 返回 QuerySet<object, object>
models.Person.objects.get(id=1) # 容易報錯, 不建議使用

# 查詢滿足條件的, 並取出需要的字段
models.Person.objects.filter(age=16).values("name", "phone") # 返回 QuerySet<dic, dic>, 使用["key"]取值
models.Person.objects.filter(age=16).values_list("name", "phone") # 返回 QuerySet<tumple, tumple>, 使用[index]取值


# 查詢不滿足條件的
models.Person.objects.exclude(id=1) # 返回 QuerySet<ob, obj>


# 查詢結果排序
models.Person.objects.all().order_by("id") # 按照 id 排序, 返回 QuerySet<obj, obj>,
models.Person.objects.all().order_by("id").reverse() # 按照 id 反序, 必須先使用 order_by() 進行排序

# 去重
distinct() # 常用於跨表查詢去重, mysql 不支持按照字段去重

# 數據條數
count() # 返回 int

# 取頭/尾數據
first() # 返回 object
last()

# 判斷是否存在
exists() # 返回 Bool


進階查詢(雙下劃線用法)

# __gt 大於, __lt 小於, __gte 大於等於, __lte 小於等於
models.Person.objects.filter(id__gt=1)
models.Person.objects.filter(id__lt=2)
models.Person.objects.filter(id__gte=1)
models.Person.objects.filter(id__lte=2)

# __in 數字包含
models.Person.objects.filter(id__in=[1,3]) # id 在列表中
models.Person.objects.exclude(id__in=[1,2]) # id 不在列表中

# __contains, __icontains 字符串包含
models.Person.objects.filter(name__contains="t") # 包含字母 t 的
models.Person.objects.filter(name__icontains="T") # 包含字母 t 和 T 的

# __range 範圍
models.Person.objects.filter(id__range=[1,4]) # id 爲 1 到 4 的

# __startswith, __endswith 以 xx 開頭, 以 xx 結尾
models.Person.objects.filter(name__startswith="t") 

# __year, __month, __day 日期格式年月日爲特定值
models.Person.objects.filter(birthday__year=2018)


編輯

# 先查詢
obj = models.Person.objects.get(id=1)
# 重新給屬性賦值
obj.name = "new_name"
# 提交給數據庫
obj.save()


# 先查詢, 再使用 delete() 刪除
models.Publisher.objects.get(id=1).delete()


一對多外鍵

表結構的創建

class Person(models.Model):
    name = models.CharField(max_length=16)
    age = models.IntegerField(default=18)
    phone = models.CharField(max_length=11, unique=True)

class Book(models.Model):
    title = models.CharField(max_length=32)
    # 一個作者寫多本書, 1對多關係
    # 外鍵寫在多的一方, django orm 創建外鍵會默認增加 _id 後綴, on_delete必寫
    author = models.ForeignKey(to="Person", on_delete=models.CASCADE)
    

查詢用法

"""
一個人可以寫多本書
"一"對應作者
"多"對應書籍
"""

# 基於對象, "多" 查 "一"
book_obj = models.Book.objects.first() # 得到一個書籍對象
book_obj.author.name # obj.屬性取值

# 基於 QuerySet, "多" 查 "一"
models.Book.objects.all().values_list("author__name") # QuerySet.values_list("外鍵字段__查詢字段")

# 基於對象, "一" 查 "多"
author_obj = models.Person.objects.first() # 得到一個作者對象
author_obj.book_set.all() # obj.查詢表名_set

# 基於 QuerySet, "一" 查 "多"
models.Person.objects.filter(id=1).values_list("book__title") # QuerySet.values_list("查詢表名__查詢字段名")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章