choices參數(數據庫字段設計常見)
"""
用戶表
性別
學歷
工作經驗
是否結婚
是否生子
客戶來源
...
針對某個可以列舉完全的可能性字段,我們應該如何存儲
只要某個字段的可能性是可以列舉完全的,那么一般情況下都會采用choices參數
"""
class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
# 性別
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)
score_choices = (
('A','優秀'),
('B','良好'),
('C','及格'),
('D','不合格'),
)
# 保證字段類型跟列舉出來的元祖第一個數據類型一致即可
score = models.CharField(choices=score_choices,null=True)
"""
該gender字段存的還是數字 但是如果存的數字在上面元祖列舉的范圍之內
那么可以非常輕松的獲取到數字對應的真正的內容
1.gender字段存的數字不在上述元祖列舉的范圍內容
2.如果在 如何獲取對應的中文信息
"""
from app01 import models
# models.User.objects.create(username='jason',age=18,gender=1)
# models.User.objects.create(username='egon',age=85,gender=2)
# models.User.objects.create(username='tank',age=40,gender=3)
# 存的時候 沒有列舉出來的數字也能存(范圍還是按照字段類型決定)
# models.User.objects.create(username='tony',age=45,gender=4)
# 取
# user_obj = models.User.objects.filter(pk=1).first()
# print(user_obj.gender)
# 只要是choices參數的字段 如果你想要獲取對應信息 固定寫法 get_字段名_display()
# print(user_obj.get_gender_display())
user_obj = models.User.objects.filter(pk=4).first()
# 如果沒有對應關系 那么字段是什么還是展示什么
print(user_obj.get_gender_display()) # 4
實際項目案例
1 # CRM相關內部表 2 class School(models.Model): 3 """ 4 校區表 5 如: 6 北京沙河校區 7 上海校區 8 9 """ 10 title = models.CharField(verbose_name='校區名稱', max_length=32) 11 12 def __str__(self): 13 return self.title 14 15 class Course(models.Model): 16 """ 17 課程表 18 如: 19 Linux基礎 20 Linux架構師 21 Python自動化開發精英班 22 Python自動化開發架構師班 23 Python基礎班 24 go基礎班 25 """ 26 name = models.CharField(verbose_name='課程名稱', max_length=32) 27 28 def __str__(self): 29 return self.name 30 31 class Department(models.Model): 32 """ 33 部門表 34 市場部 1000 35 銷售 1001 36 37 """ 38 title = models.CharField(verbose_name='部門名稱', max_length=16) 39 code = models.IntegerField(verbose_name='部門編號', unique=True, null=False) 40 41 def __str__(self): 42 return self.title 43 44 class UserInfo(models.Model): 45 """ 46 員工表 47 """ 48 49 name = models.CharField(verbose_name='員工姓名', max_length=16) 50 email = models.EmailField(verbose_name='郵箱', max_length=64) 51 depart = models.ForeignKey(verbose_name='部門', to="Department",to_field="code") 52 user=models.OneToOneField("User",default=1) 53 def __str__(self): 54 return self.name 55 56 class ClassList(models.Model): 57 """ 58 班級表 59 如: 60 Python全棧 面授班 5期 10000 2017-11-11 2018-5-11 61 """ 62 school = models.ForeignKey(verbose_name='校區', to='School') 63 course = models.ForeignKey(verbose_name='課程名稱', to='Course') 64 semester = models.IntegerField(verbose_name="班級(期)") 65 66 67 price = models.IntegerField(verbose_name="學費") 68 start_date = models.DateField(verbose_name="開班日期") 69 graduate_date = models.DateField(verbose_name="結業日期", null=True, blank=True) 70 memo = models.CharField(verbose_name='說明', max_length=256, blank=True, null=True, ) 71 72 teachers = models.ManyToManyField(verbose_name='任課老師', to='UserInfo',limit_choices_to={'depart':1002}) 73 tutor = models.ForeignKey(verbose_name='班主任', to='UserInfo',related_name="class_list",limit_choices_to={'depart':1006}) 74 75 76 def __str__(self): 77 return "{0}({1}期)".format(self.course.name, self.semester) 78 79 80 class Customer(models.Model): 81 """ 82 客戶表 83 """ 84 qq = models.CharField(verbose_name='qq', max_length=64, unique=True, help_text='QQ號必須唯一') 85 86 name = models.CharField(verbose_name='學生姓名', max_length=16) 87 gender_choices = ((1, '男'), (2, '女')) 88 gender = models.SmallIntegerField(verbose_name='性別', choices=gender_choices) 89 90 education_choices = ( 91 (1, '重點大學'), 92 (2, '普通本科'), 93 (3, '獨立院校'), 94 (4, '民辦本科'), 95 (5, '大專'), 96 (6, '民辦專科'), 97 (7, '高中'), 98 (8, '其他') 99 ) 100 education = models.IntegerField(verbose_name='學歷', choices=education_choices, blank=True, null=True, ) 101 graduation_school = models.CharField(verbose_name='畢業學校', max_length=64, blank=True, null=True) 102 major = models.CharField(verbose_name='所學專業', max_length=64, blank=True, null=True) 103 104 experience_choices = [ 105 (1, '在校生'), 106 (2, '應屆畢業'), 107 (3, '半年以內'), 108 (4, '半年至一年'), 109 (5, '一年至三年'), 110 (6, '三年至五年'), 111 (7, '五年以上'), 112 ] 113 experience = models.IntegerField(verbose_name='工作經驗', blank=True, null=True, choices=experience_choices) 114 work_status_choices = [ 115 (1, '在職'), 116 (2, '無業') 117 ] 118 work_status = models.IntegerField(verbose_name="職業狀態", choices=work_status_choices, default=1, blank=True, 119 null=True) 120 company = models.CharField(verbose_name="目前就職公司", max_length=64, blank=True, null=True) 121 salary = models.CharField(verbose_name="當前薪資", max_length=64, blank=True, null=True) 122 123 source_choices = [ 124 (1, "qq群"), 125 (2, "內部轉介紹"), 126 (3, "官方網站"), 127 (4, "百度推廣"), 128 (5, "360推廣"), 129 (6, "搜狗推廣"), 130 (7, "騰訊課堂"), 131 (8, "廣點通"), 132 (9, "高校宣講"), 133 (10, "渠道代理"), 134 (11, "51cto"), 135 (12, "智匯推"), 136 (13, "網盟"), 137 (14, "DSP"), 138 (15, "SEO"), 139 (16, "其它"), 140 ] 141 source = models.SmallIntegerField('客戶來源', choices=source_choices, default=1) 142 referral_from = models.ForeignKey( 143 'self', 144 blank=True, 145 null=True, 146 verbose_name="轉介紹自學員", 147 help_text="若此客戶是轉介紹自內部學員,請在此處選擇內部學員姓名", 148 related_name="internal_referral" 149 ) 150 course = models.ManyToManyField(verbose_name="咨詢課程", to="Course") 151 152 status_choices = [ 153 (1, "已報名"), 154 (2, "未報名") 155 ] 156 status = models.IntegerField( 157 verbose_name="狀態", 158 choices=status_choices, 159 default=2, 160 help_text=u"選擇客戶此時的狀態" 161 ) 162 163 consultant = models.ForeignKey(verbose_name="課程顧問", to='UserInfo', related_name='consultanter',limit_choices_to={'depart':1001}) 164 165 date = models.DateField(verbose_name="咨詢日期", auto_now_add=True) 166 recv_date = models.DateField(verbose_name="當前課程顧問的接單日期", null=True) 167 last_consult_date = models.DateField(verbose_name="最后跟進日期", ) 168 169 def __str__(self): 170 return self.name 171 172 class ConsultRecord(models.Model): 173 """ 174 客戶跟進記錄 175 """ 176 customer = models.ForeignKey(verbose_name="所咨詢客戶", to='Customer') 177 consultant = models.ForeignKey(verbose_name="跟蹤人", to='UserInfo',limit_choices_to={'depart':1001}) 178 date = models.DateField(verbose_name="跟進日期", auto_now_add=True) 179 note = models.TextField(verbose_name="跟進內容...") 180 181 def __str__(self): 182 return self.customer.name + ":" + self.consultant.name 183 184 class Student(models.Model): 185 """ 186 學生表(已報名) 187 """ 188 customer = models.OneToOneField(verbose_name='客戶信息', to='Customer') 189 class_list = models.ManyToManyField(verbose_name="已報班級", to='ClassList', blank=True) 190 191 emergency_contract = models.CharField(max_length=32, blank=True, null=True, verbose_name='緊急聯系人') 192 company = models.CharField(verbose_name='公司', max_length=128, blank=True, null=True) 193 location = models.CharField(max_length=64, verbose_name='所在區域', blank=True, null=True) 194 position = models.CharField(verbose_name='崗位', max_length=64, blank=True, null=True) 195 salary = models.IntegerField(verbose_name='薪資', blank=True, null=True) 196 welfare = models.CharField(verbose_name='福利', max_length=256, blank=True, null=True) 197 date = models.DateField(verbose_name='入職時間', help_text='格式yyyy-mm-dd', blank=True, null=True) 198 memo = models.CharField(verbose_name='備注', max_length=256, blank=True, null=True) 199 200 def __str__(self): 201 return self.customer.name 202 203 class ClassStudyRecord(models.Model): 204 """ 205 上課記錄表 (班級記錄) 206 """ 207 class_obj = models.ForeignKey(verbose_name="班級", to="ClassList") 208 day_num = models.IntegerField(verbose_name="節次", help_text=u"此處填寫第幾節課或第幾天課程...,必須為數字") 209 teacher = models.ForeignKey(verbose_name="講師", to='UserInfo',limit_choices_to={'depart':1002}) 210 date = models.DateField(verbose_name="上課日期", auto_now_add=True) 211 212 course_title = models.CharField(verbose_name='本節課程標題', max_length=64, blank=True, null=True) 213 course_memo = models.TextField(verbose_name='本節課程內容概要', blank=True, null=True) 214 has_homework = models.BooleanField(default=True, verbose_name="本節有作業") 215 homework_title = models.CharField(verbose_name='本節作業標題', max_length=64, blank=True, null=True) 216 homework_memo = models.TextField(verbose_name='作業描述', max_length=500, blank=True, null=True) 217 exam = models.TextField(verbose_name='踩分點', max_length=300, blank=True, null=True) 218 219 def __str__(self): 220 return "{0} day{1}".format(self.class_obj, self.day_num) 221 222 class StudentStudyRecord(models.Model): 223 ''' 224 學生學習記錄 225 ''' 226 classstudyrecord = models.ForeignKey(verbose_name="第幾天課程", to="ClassStudyRecord") 227 student = models.ForeignKey(verbose_name="學員", to='Student') 228 229 230 231 232 233 234 235 record_choices = (('checked', "已簽到"), 236 ('vacate', "請假"), 237 ('late', "遲到"), 238 ('noshow', "缺勤"), 239 ('leave_early', "早退"), 240 ) 241 record = models.CharField("上課紀錄", choices=record_choices, default="checked", max_length=64) 242 score_choices = ((100, 'A+'), 243 (90, 'A'), 244 (85, 'B+'), 245 (80, 'B'), 246 (70, 'B-'), 247 (60, 'C+'), 248 (50, 'C'), 249 (40, 'C-'), 250 (0, ' D'), 251 (-1, 'N/A'), 252 (-100, 'COPY'), 253 (-1000, 'FAIL'), 254 ) 255 score = models.IntegerField("本節成績", choices=score_choices, default=-1) 256 homework_note = models.CharField(verbose_name='作業評語', max_length=255, blank=True, null=True) 257 note = models.CharField(verbose_name="備注", max_length=255, blank=True, null=True) 258 259 homework = models.FileField(verbose_name='作業文件', blank=True, null=True, default=None) 260 stu_memo = models.TextField(verbose_name='學員備注', blank=True, null=True) 261 date = models.DateTimeField(verbose_name='提交作業日期', auto_now_add=True) 262 263 def __str__(self): 264 return "{0}-{1}".format(self.classstudyrecord, self.student) 265 266 """ 267 chocies參數使用場景是非常廣泛的 268 """
MTV與MVC模型
# MTV:Django號稱是MTV模型 M:models T:templates V:views # MVC:其實django本質也是MVC M:models V:views C:controller # vue框架:MVVM模型
多對多三種創建方式
# 全自動:利用orm自動幫我們創建第三張關系表
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
"""
優點:代碼不需要你寫 非常的方便 還支持orm提供操作第三張關系表的方法...
不足之處:第三張關系表的擴展性極差(沒有辦法額外添加字段...)
"""
# 純手動
class Book(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
'''
優點:第三張表完全取決于你自己進行額外的擴展
不足之處:需要寫的代碼較多,不能夠再使用orm提供的簡單的方法
不建議你用該方式
'''
# 半自動
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',
through='Book2Author',
through_fields=('book','author')
)
class Author(models.Model):
name = models.CharField(max_length=32)
# books = models.ManyToManyField(to='Book',
# through='Book2Author',
# through_fields=('author','book')
# )
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
"""
through_fields字段先后順序
判斷的本質:
通過第三張表查詢對應的表 需要用到哪個字段就把哪個字段放前面
你也可以簡化判斷
當前表是誰 就把對應的關聯字段放前面
半自動:可以使用orm的正反向查詢 但是沒法使用add,set,remove,clear這四個方法
"""
浙公網安備 33010602011771號