orm欄位引數、欄位關係,手動建立第三張表,Meta元資訊,原生sql
阿新 • • 發佈:2022-03-11
1.null 是否可以為空
2.unique 是否唯一
3.db_index 是否給該欄位建索引
4.default 預設值為
5.DateField和DateTimeField 兩個引數
# auto_now_add
配置auto_now_add=True,建立資料記錄的時候會把當前時間新增到資料庫
# auto_now
配置auto_now=True,每次更新資料記錄的時候會更新該欄位
6.choices
在model表模型定義的時候給某個欄位指定choice
sex_choice=((1,'男'),(2,'女'))
sex=models.IntegerField(default=1,choices=sex_choice)
在使用的時候,直接取出中文
物件.get_sex_display()
前端
<td>{{ author.get_sex_display }}</td>
7.瞭解的
verbose_name Admin中顯示的欄位名稱
blank Admin中是否允許使用者輸入為空
editable Admin中是否可以編輯
help_text Admin中該欄位的提示資訊
choices Admin中顯示選擇框的內容,用不變動的資料放在記憶體中從而避免跨表操作
欄位關係
1.一對一 一對多 多對多
2.ForeignKey
to:對哪張表
to_field:對錶中的某個欄位
related_name:反向操作時,使用的欄位名,用於代替原反向查詢時的 表名_set
related_query_name:反向查詢操作時,使用的連線字首,用於替換表名
on_delete: # 級聯刪除
當刪除關聯表中的資料時,當前表與其關聯的行的行為
models.CASCADE
刪除關聯資料,與之關聯也刪除
models.DO_NOTHING
刪除關聯資料,什麼都不做
models.PROTECT
刪除關聯資料,引發錯誤ProtectedError
models.SET_NULL
刪除關聯資料,與之關聯的值設定為null(前提FK欄位需要設定為可空)
models.SET_DEFAULT
刪除關聯資料,與之關聯的值設定為預設值(前提FK欄位需要設定預設值)
models.SET
刪除關聯資料,
a. 與之關聯的值設定為指定值,設定:models.SET(值)
b. 與之關聯的值設定為可執行物件的返回值,設定:models.SET(可執行物件)
db_constraint
True:建立外來鍵,預設是True
False:不建立外來鍵
外來鍵是否建立:
好處:不會出現髒資料
壞處:插入的時候,效率低
3.OneToOneField # 一對一
4.ManyToManyField # 多對多
手動建立第三張表
欄位引數
db_table:指定第三張表的名字
to:關聯的表
related_name 同ForeignKey欄位
related_query_name 同ForeignKey欄位
through:手動建立第三張表,指定通過哪個表
through_fields:關聯欄位是什麼
多對多關係建立的三種方式
第一種:自動建立 # 常用:第三張表沒有其它欄位
第二種:手動建立第三張表 # 比較常用:第三張表有多餘欄位
第三種:完全手動寫第三張表
# 第一種:自動建立
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name='書名')
# 通過orm自帶的ManyToManyField自動建立第三張表
class Author(models.Model):
name=models.CharField(max_length=32,verbose_name='作者姓名')
books=models.ManyToManyField(to='Book',related_name='authors')
# 第二種:手動建立第三張表,第三張表有多餘欄位
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name='書名')
# 自己建立第三張表,並通過ManyToManyField指定關聯
class Author(models.Model):
name=models.CharField(max_length=32,verbose_name='作者姓名')
books=models.ManyToManyField(to='Book',through='Author2Book',through_fields=('author','book'))
# through_fields 元組的第一個值是ManyToManyField所在的表去中間表通過哪個欄位,就寫在第一個位置
class Author2Book(models.Model):
author=models.ForeignKey(to='Author')
book=models.ForeignKdy(to='Book')
sex_choice=((1,'男'),(2,'女'))
sex=models.IntegerField(default=1,choices=sex_choice)
'''
1.基於物件的跨表查,還能繼續使用
2.基於雙下劃線連表查
3.原來的多對多操作api用不了了,需要手動操作
'''
# 第三種:完全手動寫第三張表
class Book(models.Model):
title=models.CharField(max_length=32,verbose_name='書名')
class Author(models.Model):
name=models.CharField(max_length=32,verbose_name='作者姓名')
# 自己建立第三張表,分別通過外來鍵關聯書和作者
class Author2Book(models.Model):
author=models.ForeignKey(to='Author')
book=models.ForeignKey(to='Book')
# 在每一個模型類中都可以寫
class Meta: # 元資訊
db_table='ldb_publish' # 表名
index_together=('name','city') # 多個欄位聯合索引
unique_together=('name','city') # 聯合唯一
ordering=('nid',) # 預設以哪個欄位排序
原生sql
from app01 import models
res=models.Author.objects.all()
for author in res:
print(author.sex)
print(author.get_sex_display())
# 使用原生sql
res=models.Author.objects.raw('select * from app01_author where nid>1')
for author in res:
print(author.name)
# 執行原生sql,跟物件型別無關了,查出什麼欄位,可以直接使用該欄位
res=models.Author.objects.raw('select * from app01_book where nid>1')
for book in res:
print(book.price)