1. 程式人生 > 其它 >Django | ORM choices引數詳解

Django | ORM choices引數詳解

choices引數(資料庫欄位設計)

# 在資料庫欄位設計階段,只要某個欄位的可能性是可以列舉完全的,那麼一般情況下都會採用choices引數

# 什麼是可以列舉完全的呢?
答 :就是一個數據的結果就是定數,
	比如:資料的結果為性別(男/女)
    	  資料的結果為學歷(小學,高中,大學,研究生,博士,等等)
          資料的結果為是否結婚(已婚/未婚).....
            
# 像這樣的資料,都是可以列舉完全的,那麼這種資料欄位,一般採用choices引數
Django模型中的欄位有個choices屬性,這個屬性可以提供被選資料,choices的引數是一個元組,它裡面也是元組構成,第一個引數是choices的可選引數,第二個是對這個引數的說明。如果一個欄位設定了這個屬性,在模版中如果我要顯示這個欄位,那麼django模版系統就會將它預設解析為一個下拉選單,這樣對於一個靜態的下拉選單式很方便的.下面我們來看對這個引數的具體使用

示例演示:

class User(models.Model):
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    gender_choices = (
        (1,'男'),     # 使用int型別
        (2,'女'),
        (3,'其他')
    )   
# 先列舉所有的對應關係,元組的形式,第一個引數相當於變數名,第二個引數相當於變數值,可通過變數名找到對應的變數值。
    gender = models.IntegerField(choices=gender_choices)  
# 元組內第一個元組的第一個元素是什麼型別這裡就要定義什麼型別,括號內填寫choices引數,引數的值為定義好的對應關係
    """
    該gender欄位存的還是數字 但是如果存的數字在上面元祖列舉的範圍之內
    那麼可以非常輕鬆的獲取到數字對應的真正的內容

    """

    score_choices = (
        ('A','優秀'),   # 使用字元型別
        ('B','良好'),
        ('C','及格'),
        ('D','差')
    )
    score = models.CharField(max_length=32,choices=score_choices)

研究:

1.gender欄位存的數字不在上述元祖列舉的範圍內容
2.如果在 如何獲取對應的中文資訊
    # 存
    models.User.objects.create(username='jack',age=19,gender=1,score='A')
    models.User.objects.create(username='tom',age=20,gender=2,score='B')
    models.User.objects.create(username='kevin',age=31,gender=3,score='C')
    # 驗證沒有建立對應關係的值是否可以儲存進出
    models.User.objects.create(username='gary',age=25,gender=4,score='D')
    models.User.objects.create(username='gary',age=25,gender=5,score='E')

    # 取:
    user_obj = models.User.objects.filter(pk=1).first()
    print(user_obj.gender)
    print(user_obj.get_gender_display())   # 
    # 只要是choices引數的欄位 如果你想要獲取對應資訊 固定寫法 get_欄位名_display()
    res = models.User.objects.filter(pk=4).first()
    print(res.gender)
    print(res.get_gender_display())
    # 如果沒有對應關係 那麼欄位是什麼還是展示什麼
    res1 = models.User.objects.filter(pk=5).first()
    print(res1.score)
    print(res1.get_score_display())
    # 如果沒有對應關係 那麼欄位是什麼還是展示什麼