15.Django_ORM_創建數據庫模型類、常用字段屬性和選項

模型類的字段屬性和選項

模型類屬性命名限制

  1. 不可以是python的保留關鍵字
  2. 不可用使用連續的_,因爲django的查詢方式不支持
  3. 定義屬性的時候,需要指定字段的類型,可通過字段類型的事參數來制定選項,
  4. 語法:屬性名 = models.字段類型(必參、選項)

a、 單個模型時、常用的字段

1.自增長字段
xx = models.AutoField()  # 自增長
xx = models.BigAutoField()  # 自增長,允許可增長的數字更大
2.二進制數據
xx = models.BinaryField()
3.布爾型
xx = models.BooleanField()  # 不允許爲空
xx = models.NullBooleanField()  # 允許爲空
4.整型
xx = models.PostitiveSmallIntegerField()  # 正整數、最多可存儲大小爲5個字節
xx = models.SmallIntegerField()  # 整數、6個字節
xx = models.PositiveIntegerField()  # 正整數、10個字節
xx = models.IntegerField()  # 整數、11個字節
xx = models.BigIntegerField()  # 整數、20個字節
5.字符串
xx = models.CharField()  #  對應sql的vachar
xx = models.TextField()  #  對應sql的longtext
6.時間日期類型
xx = models.DateField()  # 年月日
xx = models.DateTimeField()  # 年月日時分秒
xx = models.DurationField()  # int,底層是python timedelta
7.浮點型
xx = models.FloatField()  # float
xx = models.DecimalField()  # 需指定整數的位數、小數的位數
8.其他字段
xx = models.EmailField()  # 郵箱
xx = models.ImageField()  #
xx = models.FileFiled()  # 文件
xx = models.FilePathField()  # 文件路徑
xx = models.URLField()
xx = models.UUIDField()
xx = models.GenericIPAddressField()  # ipv4、ipv6地址

b、 多個模型時、關係型字段

  • OneToOneField:一對一
  • ForeignKey:多對一
  • ManyToManyField:多對多;默認或自定義中間表
    polls.pymodels.py
class A(models.Model):
    onetoone = models.OneToOneField(Admin)  # A表和Admin表是一對一關係


class B(models.Model):
    foreign = models.ForeignKey(A)  # B表和A表是多對一關係


class C(models.Model):

    manytomany = models.ManyToManyField(B)  # C表和B表是多對多關係

c、字段參數

1.所有字段都有的參數
db_column="value"  # 給字段設置名稱,不使用默認名
primary_key = False/True  # 該字段是否是主鍵,默認是False
verbose_name='備註名'  # 設置字段的備註名
unique=True/False  # 字段是否是唯一鍵,字段的數據在表中是唯一的
/* 下面這兩個值要一致 */
null=True/False  # 在數據庫中,該字段是否可爲空,默認不可爲空
blank=True/False  #  在前端表單中,該字段是否可爲空

db_index = True/False  # 字段設置索引
help_text = 'value'  # 字段幫助文本
editable=True/False  # 是否可對字段值進行編輯,默認是True
default = 'value'  # 設置字段的默認值

# 對應數據庫的枚舉類型,一般用於可選並且有限的字段,可以提高數據庫的查詢效率以及節省空間;
# 可以通過self.get_字段名_display()獲取元組的第一個值(0, 1, 2)對應的字符串('保密''男''女')
choices=((0, '保密'), (1, '男'), (2, '女'))
2.個別字段具有的參數
# 1.字符串字段
Char = models.CharField(max_leng = 100)  # 設置最大長度爲100,爲utf8的長度

# 2.日期字段
Date = models.DateField(unique_for_data=True/False)  # 字段日期是否唯一
Date = models.DateField(unique_for_month=True/False)  # 字段月份是否唯一
''' 下面兩個字段建議每個模型都加上,以便於後面的排序操作'''
Date = models.DateField(auto_now=True/False)  # 更新的時間(進行更新數據操作時,這個就是更新的時間)
Date = models.DateField(auto_now_add=True/False)  # 新增的時間(進行新增數據操作時,這個就是新增的時間)

# 3.浮點型
Decimal = models.DecimalField(max_digits=4, decimal_places=2)  # 分別是:總共4個位數,小數點2個位數。比如:12.12, 11.31
3.關係型字段具有的參數
## 1. # 指定主表的外鍵;用於外鍵反向關聯查詢,通過副表查詢到主表的信息(反向關聯名稱)
related_name = 'value' 
# 比如:
class A(models.Model):
    onetoone = models.OneToOneField(Admin, related_name = 'one')  # 字表是A,副表是Admin。現在Admin可通過one這個外鍵字段,查詢到A的相關關係

# 2. 當外鍵關聯的的對象被刪除時,Django將模仿on_delete參數定義的SQL來執行對應的操作
# 比如:
class B(models.Model):
    foreign = models.ForeignKey(A, on_delete=行爲)  
"""
on_delete的值/六種對應的行爲:

1.on_delete.models.CASCADE:模擬SQL的ON_DELETE_CASCADE約束,將定義有外鍵的模型對象同時刪除(是當前版本Django的默認操作)
刪除級聯:比如說A表的一些字段被刪除了,那麼B表關聯到這些字段的數據也會被刪除【常用】
class B(models.Model):
    foreign = models.ForeignKey(A, on_delete=行爲) 

2.on_delete.PROTECT:阻止1的刪除操作,但是拋出ProtectedError異常
被關聯的字段被刪除後,就拋出ProtectedError異常

3.on_delete.SET_NULL:將外鍵字段設置爲null,只有當字段設置了null=True、blank=True時,纔可以使用該行爲【常用】
刪除置空,當副表中的記錄被刪除時,子表對應的字段的值設置爲null
class B(models.Model):
    foreign = models.ForeignKey(A, on_delete=行爲, null = True, blank=True) 

4.on_delete.SET_DEFAULT:將外鍵字段設置爲默認值,只有當字段設置了default參數時,纔可以使用
class B(models.Model):
    foreign = models.ForeignKey(A, on_delete=行爲, default=1) 

5.on_delete.DO_NOTHING:什麼都不處理

6.on_delete.SET(xx):xx可以是一個傳遞給SET()的值或者一個回調函數的返回值,大小寫敏感
"""
4.自關聯

一個數據表中,字段A關聯字段B。
比如說:地址的省市縣,這三個地區從3個不同的模型獲取數據,然後使用一對多的外鍵進行關聯。但是這樣是不合理的,比較合理的方法是使用自關聯來實現:自關聯例子

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