1. 程式人生 > 其它 >orm欄位引數、欄位關係,手動建立第三張表,Meta元資訊,原生sql

orm欄位引數、欄位關係,手動建立第三張表,Meta元資訊,原生sql

orm欄位引數

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')

Meta元資訊

# 在每一個模型類中都可以寫
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)