日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Django框架Day3------之Models

發布時間:2024/8/26 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django框架Day3------之Models 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Django models字段類型清單:

AutoField:一個自動遞增的整型字段,添加記錄時它會自動增長。你通常不需要直接使用這個字段;如果你不指定主鍵的話,系統會自動添加一個主鍵字段到你的model。(參閱自動主鍵字段)

BooleanField:布爾字段,管理工具里會自動將其描述為checkbox。

CharField:字符串字段,單行輸入,用于較短的字符串,如要保存大量文本, 使用 TextField,CharField有一個必填參數:

CharField.max_length:字符的最大長度,django會根據這個參數在數據庫層和校驗層限制該字段所允許的最大字符數。

TextField:一個容量很大的文本字段,?admin 管理界面用 <textarea>多行編輯框表示該字段數據。

CommaSeparatedIntegerField:用于存放逗號分隔的整數值。類似 CharField,必須maxlength 參數。

DateField:日期字段,admin 用一個文本框 <input type=”text”> 來表示該字段數據(附帶一個 JavaScript 日歷和一個”Today”快捷按鍵。有下列額外的可選參數:

auto_now:當對象被保存時,自動將該字段的值設置為當前時間.通常用于表示 “last-modified” 時間戳;
auto_now_add:當對象首次被創建時,自動將該字段的值設置為當前時間.通常用于表示對象創建時間。

DateTimeField:類似 DateField 支持同樣的附加選項。

EmailField:一個帶有檢查 Email 合法性的 CharField,不接受 maxlength 參數。

FileField:一個文件上傳字段。?要求一個必須有的參數: upload_to, 一個用于保存上載文件的本地文件系統路徑。 這個路徑必須包含 strftime formatting, 該格式將被上載文件的 date/time 替換(so that uploaded files don’t fill up the given directory)。在一個 model 中使用 FileField 或 ImageField 需要以下步驟:在你的 settings 文件中, 定義一個完整路徑給 MEDIA_ROOT 以便讓 Django在此處保存上傳文件。 (出于性能考慮,這些文件并不保存到數據庫。) 定義 MEDIA_URL 作為該目錄的公共 URL。 要確保該目錄對 WEB 服務器用戶帳號是可寫的。在你的 model 中添加 FileField 或 ImageField, 并確保定義了 upload_to 選項,以告訴 Django 使用 MEDIA_ROOT 的哪個子目錄保存上傳文件。你的數據庫中要保存的只是文件的路徑(相對于 MEDIA_ROOT)。 出于習慣你一定很想使用 Django 提供的 get_<fieldname>_url 函數。舉例來說,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object。get_mug_shot_url }} 這樣的方式得到圖像的絕對路徑。

FilePathField:選擇指定目錄按限制規則選擇文件,有三個參數可選, 其中”path”必需的,這三個參數可以同時使用,?參數描述:

path:必需參數,一個目錄的絕對文件系統路徑。 FilePathField 據此得到可選項目。 Example: “/home/images”;
match:可選參數, 一個正則表達式, 作為一個字符串, FilePathField 將使用它過濾文件名。 注意這個正則表達式只會應用到 base filename 而不是路徑全名。 Example: “foo。*\。txt^”, 將匹配文件 foo23.txt 卻不匹配 bar.txt 或 foo23.gif;
recursive:可選參數, 是否包括 path 下全部子目錄,True 或 False,默認值為 False。

match 僅應用于 base filename, 而不是路徑全名。 如:FilePathField(path=”/home/images”, match=”foo.*”, recursive=True)…會匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif

?

FloatField:浮點型字段。 必須提供兩個參數,參數描述:

max_digits:總位數(不包括小數點和符號)
decimal_places:小數位數。如:要保存最大值為 999 (小數點后保存2位),你要這樣定義字段:models.FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百萬(小數點后保存10位)的話,你要這樣定義:models.FloatField(…,max_digits=19, decimal_places=10)

ImageField:類似 FileField, 不過要校驗上傳對象是否是一個合法圖片。它有兩個可選參數:height_field 和 width_field,如果提供這兩個參數,則圖片將按提供的高度和寬度規格保存。?該字段要求 Python Imaging 庫。

IntegerField:用于保存一個整數。

IPAddressField:一個字符串形式的 IP 地址, (如 “202.1241.30″)。

NullBooleanField:類似 BooleanField, 不過允許 NULL 作為其中一個選項。 推薦使用這個字段而不要用 BooleanField 加 null=True 選項。?admin 用一個選擇框 <select> (三個可選擇的值: “Unknown”, “Yes” 和 “No” ) 來表示這種字段數據。

PhoneNumberField:一個帶有合法美國風格電話號碼校驗的 CharField(格式:XXX-XXX-XXXX)。

PositiveIntegerField:類似 IntegerField, 但取值范圍為非負整數(這個字段應該是允許0值的…可以理解為無符號整數)

PositiveSmallIntegerField:正小整型字段,類似 PositiveIntegerField, 取值范圍較小(數據庫相關)SlugField“Slug” 是一個報紙術語。 slug 是某個東西的小小標記(短簽), 只包含字母數字下劃線和連字符。它們通常用于URLs。?若你使用 Django 開發版本,你可以指定 maxlength。 若 maxlength 未指定, Django 會使用默認長度: 50,它接受一個額外的參數:

prepopulate_from: 來源于slug的自動預置列表

SlugField:是一個報紙術語. slug 是某個東西的小小標記(短簽), 只包含字母,數字,下劃線和連字符.它們通常用于URLs。

SmallIntegerField類似 IntegerField, 不過只允許某個取值范圍內的整數。(依賴數據庫)

TimeField:時間字段,類似于 DateField 和?DateTimeField。

URLField:用于保存 URL。 若 verify_exists 參數為 True (默認), 給定的 URL 會預先檢查是否存在(即URL是否被有效裝入且沒有返回404響應)。

USStateField:美國州名縮寫,由兩個字母組成(天朝人民無視)。

XMLField:XML字符字段,校驗值是否為合法XML的 TextField,必須提供參數:

schema_path:校驗文本的 RelaxNG schema 的文件系統路徑。

附:Field 選項

    • null :缺省設置為false.通常不將其用于字符型字段上,比如CharField,TextField上.字符型字段如果沒有值會返回空字符串。

    • blank:該字段是否可以為空。如果為假,則必須有值

    • choices:一個用來選擇值的2維元組。第一個值是實際存儲的值,第二個用來方便進行選擇。如SEX_CHOICES= ((‘F’,'Female’),(‘M’,'Male’),)

    • core:db_column,db_index?如果為真將為此字段創建索引

    • default:設定缺省值

    • editable:如果為假,admin模式下將不能改寫。缺省為真

    • help_text:admin模式下幫助文檔

    • primary_key:設置主鍵,如果沒有設置django創建表時會自動加上:

id = meta.AutoField('ID', primary_key=True) primary_key=True implies blank=False, null=False and unique=True. Only oneprimary key is allowed on an object.
  • radio_admin:用于admin模式下將select轉換為radio顯示。只用于ForeignKey或者設置了choices
  • unique:數據唯一
  • unique_for_date:日期唯一,如下例中系統將不允許title和pub_date兩個都相同的數據重復出現
  • title =?meta.CharField(maxlength=30,unique_for_date=’pub_date’)
  • unique_for_month / unique_for_year:用法同上
  • validator_list:有效性檢查。非有效產生 django.core.validators.ValidationError 錯誤

附代碼 參考:

1 # -*- coding:utf-8 -*- 2 from django.db import models 3 4 # Create your models here. 5 from django.core.exceptions import ValidationError 6 from django.db import models 7 from django.contrib.auth.models import User 8 9 10 course_type_choices = ( 11 ('online',u'網絡班'), 12 ('offline_weekend',u'面授班(周末)',), 13 ('offline_fulltime',u'面授班(脫產)',), 14 ) 15 16 class School(models.Model): 17 name = models.CharField(max_length=128,unique=True) 18 city = models.CharField(max_length=64) 19 addr = models.CharField(max_length=128) 20 21 def __unicode__(self): 22 return self.name 23 24 25 class UserProfile(models.Model): 26 user = models.OneToOneField(User) 27 name = models.CharField(max_length=64) 28 school = models.ForeignKey('School') 29 30 def __unicode__(self): 31 return self.name 32 33 34 class Customer(models.Model): 35 qq = models.CharField(max_length=64, unique=True) 36 name = models.CharField(max_length=32, blank=True, null=True) 37 phone = models.BigIntegerField(blank=True, null=True) 38 course = models.ForeignKey('Course') 39 40 course_type = models.CharField(max_length=64,choices=course_type_choices,default='online') 41 consult_memo = models.TextField() 42 source_type_choices = (('qq',u'qq群'), 43 ('referral',u'內部轉介紹'), 44 ('51cto',u'51cto'), 45 ('agent',u'招生代理'), 46 ('others',u'其他'), 47 ) 48 source_type = models.CharField(max_length=64,choices=source_type_choices,default='qq') 49 referral_from = models.ForeignKey('self',blank=True,null=True,related_name="referraled_who") 50 51 status_choices = (('signed',u'已報名'), 52 ('unregistered',u'未報名'), 53 ('graduated',u'已畢業'), 54 ('drop-off',u'退學'), 55 ) 56 status = models.CharField(choices=status_choices,max_length=64) 57 consultant = models.ForeignKey('UserProfile',verbose_name=u'課程顧問') 58 class_list = models.ManyToManyField('ClassList',blank=True) 59 date = models.DateField(u'咨詢日期',auto_now_add=True) 60 61 def __unicode__(self): 62 return "%s(%s)" % (self.qq, self.name) 63 64 65 class CustomerTrackRecord(models.Model): 66 customer = models.ForeignKey(Customer) 67 track_record = models.TextField(u'跟蹤記錄') 68 tracd_date = models.DateField(auto_now_add=True) 69 follewer = models.ForeignKey(UserProfile) 70 status_choices = ((1,u"近期無報名計劃"), 71 (2,u"2個月內報名"), 72 (3,u"1個月內報名"), 73 (4,u"2周內報名"), 74 (5,u"1周內報名"), 75 (6,u"2天內報名"), 76 (7,u"已報名"), 77 ) 78 status = models.IntegerField(u"狀態",choices=status_choices,help_text=u"選擇客戶此時的狀態") 79 80 def __unicode__(self): 81 return self.customer 82 83 84 class Course(models.Model): 85 name = models.CharField(max_length=64, unique=True) 86 online_price = models.IntegerField() 87 offline_price = models.IntegerField() 88 introduction = models.TextField() 89 90 def __unicode__(self): 91 return self.name 92 93 94 class ClassList(models.Model): 95 course = models.ForeignKey(Course,verbose_name=u'課程') 96 semester = models.IntegerField(verbose_name=u'學期') 97 course_type = models.CharField(max_length=64,choices=course_type_choices,default='online') 98 teachers = models.ManyToManyField(UserProfile) 99 start_date = models.DateField() 100 gradate_date = models.DateField() 101 102 def __unicode__(self): 103 return "%s (%s)(%s)" %(self.course.name,self.course_type,self.semester) 104 105 class Meta: 106 unique_together = ('course','semester','course_type') 107 108 109 class CourseRecord(models.Model): 110 class_obj = models.ForeignKey(ClassList) 111 day_num = models.IntegerField(u'第幾節課') 112 course_date = models.DateField(auto_now_add=True, verbose_name=u'上課時間') 113 teacher = models.ForeignKey(UserProfile) 114 115 def __unicode__(self): 116 return '%s, %s' % (self.class_obj, self.day_num) 117 118 class Meta: 119 unique_together = ('class_obj','day_num') 120 121 122 class StudyRecord(models.Model): 123 course_record = models.ForeignKey(CourseRecord) 124 student = models.ForeignKey(Customer) 125 record_choices = (('checked', u"已簽到"), 126 ('late', u"遲到"), 127 ('noshow', u"缺勤"), 128 ('leave_early', u"早退"), 129 ) 130 record = models.CharField(u"上課紀錄", choices=record_choices, default="checked", max_length=64) 131 score_choices = ((100, 'A+'), 132 (90, 'A'), 133 (85, 'B+'), 134 (80, 'B'), 135 (70, 'B-'), 136 (60, 'C+'), 137 (50, 'C'), 138 (40, 'C-'), 139 (0, 'D'), 140 (-1, 'N/A'), 141 (-100, 'COPY'), 142 (-1000, 'FAIL'), 143 ) 144 score = models.IntegerField(u"本節成績", choices=score_choices, default=-1) 145 date = models.DateTimeField(auto_now_add=True) 146 note = models.CharField(u"備注", max_length=255, blank=True, null=True) 147 148 def __unicode__(self): 149 return "%s,%s,%s" % (self.course_record, self.student, self.record) View Code

更多參數:

1、null=True數據庫中字段是否可以為空 2、blank=Truedjango的 Admin 中添加數據時是否可允許空值 3、primary_key = False主鍵,對AutoField設置主鍵后,就會代替原來的自增 id 列 4、auto_now 和 auto_now_addauto_now 自動創建---無論添加或修改,都是當前操作的時間auto_now_add 自動創建---永遠是創建時的時間 5、choices GENDER_CHOICE = ((u'M', u'Male'),(u'F', u'Female'),) gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 6、max_length 7、default  默認值 8、verbose_name  Admin中字段的顯示名稱 9、name|db_column  數據庫中的字段名稱 10、unique=True  不允許重復 11、db_index = True  數據庫索引 12、editable=True  在Admin里是否可編輯 13、error_messages=None  錯誤提示 14、auto_created=False  自動創建 15、help_text  在Admin中提示幫助信息 16、validators=[] 17、upload-to 上傳到哪個位置,更多與image,filepath配合使用

連表結構

  • 一對多:models.ForeignKey(其他表)
  • 多對多:models.ManyToManyField(其他表)
  • 一對一:models.ManyToManyField(其他表)
  • 應用場景:

    應用場景:一對多:當一張表中創建一行數據時,有一個單選的下拉框(可以被重復選擇)例如:創建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。 多對多:在某表中創建一行數據是,有一個可以多選的下拉框例如:創建用戶信息,需要為用戶指定多個愛好 一對一:在某表中創建一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了例如:原有含10列數據的一張表保存相關信息,經過一段時間之后,10列無法滿足需求,需要為原來的表再添加5列數據

      注意:

      1.models.py中class設置的數據,本身返回一個類,如果想直接返回某一個字段的值,可以定義__unicode__,比如:

    class TypeUser(models.Model):name = models.CharFiled(max_length=32)def __unicode__(self):return self.name

      2.在設置ForeignKey時,參數中的第一個參數為表明,需要注意的是,加不加引號有區別,加引號后表的定義順序可以隨便,但不加引號必須按照順序來

      3.多對多,有兩種創建方式

  • 自建第三張表
  • 自動創建,比如:

    #自建第三張表 class B2G(models.Model):boy = models.ForeignKey('Boy')girl = models.ForeignKey('Girl')class Boy(models.Model):name = models.CharField(max_length=32)# 吳文煜,王建,王志剛,杜寶強class Girl(models.Model):name = models.CharField(max_length=32)#自動創建f = models.ManyToManyField(Boy)
  •   4.queryset:從數據庫中提取出來的數據為queryset類型,是Django中的一種特殊類型

    w = models.Simp.objects.all() print(w, type(w)) [<Simp: chenc>, <Simp: zan>, <Simp: zhangsan>]<class 'django.db.models.query.QuerySet'>

    可以看到,從數據庫取出個數據看起來像包含對象的列表。而實際上整個數據為django中的特殊類型QuerySet。

    如果需要查看原來的SQL語句,可以使用queryset.query:

    print(w.query)

      5.values() 和 vlue_list() 與 all()區別

        .all()是取得所有列的數據,可以加.values()取出某一列,每一個元素為一個字典:

    obj = model.UserInfo.objects.filter(name='alex').values('id','email') # select id from userinfo where name = 'alex' queryset -> python,Django的類 [{'id':1},{'id': 2},]

      values_list(),獲取到的元素為一個個元組,也可以加多個參數來獲取多列:

    obj = model.UserInfo.objects.filter(name='alex').value_list('id','email') # select id from userinfo where name = 'alex' queryset -> python,Django的類 [(1,'1@qq.com'),(2,'alex@11.com'),]

    二、表的基本操作

    1.基本操作:

    ## # models.Tb1.objects.create(c1='xx', c2='oo') 增加一條數據,可以接受字典類型數據 **kwargs# obj = models.Tb1(c1='xx', c2='oo')# obj.save()## # models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議)# models.Tb1.objects.all() # 獲取全部# models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據## # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據## models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數據更新,均支持 **kwargs# obj = models.Tb1.objects.get(id=1)# obj.c1 = '111'# obj.save() # 修改單條數據

    2.進階操作

    利用雙下劃線將字段和對應的操作連接起來(了不起的雙下劃線)

    # 獲取個數# # models.Tb1.objects.filter(name='seven').count()# 大于,小于# # models.Tb1.objects.filter(id__gt=1) # 獲取id大于1的值# models.Tb1.objects.filter(id__lt=10) # 獲取id小于10的值# models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大于1 且 小于10的值# in# # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等于11、22、33的數據# models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in# contains# # models.Tb1.objects.filter(name__contains="ven")# models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感# models.Tb1.objects.exclude(name__icontains="ven")# range# # models.Tb1.objects.filter(id__range=[1, 2]) # 范圍bettwen and# 其他類似# # startswith,istartswith, endswith, iendswith,# order by# # models.Tb1.objects.filter(name='seven').order_by('id') # asc# models.Tb1.objects.filter(name='seven').order_by('-id') # desc# limit 、offset# # models.Tb1.objects.all()[10:20]# group by 去重 values('id')在annotate前面就是為了根據id生成group by#需要固定導入,稱為聚合函數from django.db.models import Count, Min, Max, Sum# models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))moddels.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('id')).values('id'','name')# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

    3.連表操作(了不起的雙下劃線)

    利用雙下劃線和_set將表之間的操作連接起來

    數據庫表結構:

    class UserProfile(models.Model):user_info = models.OneToOneField('UserInfo')username = models.CharField(max_length=64)password = models.CharField(max_length=64)def __unicode__(self):return self.usernameclass UserInfo(models.Model):user_type_choice = ((0, u'普通用戶'),(1, u'高級用戶'),)user_type = models.IntegerField(choices=user_type_choice)name = models.CharField(max_length=32)email = models.CharField(max_length=32)address = models.CharField(max_length=128)def __unicode__(self):return self.nameclass UserGroup(models.Model):caption = models.CharField(max_length=64)user_info = models.ManyToManyField('UserInfo')def __unicode__(self):return self.captionclass Host(models.Model):hostname = models.CharField(max_length=64)ip = models.GenericIPAddressField()user_group = models.ForeignKey('UserGroup')def __unicode__(self):return self.hostname

    一對一操作:

    user_info_obj = models.UserInfo.objects.filter(id=1).first() print user_info_obj.user_type print user_info_obj.get_user_type_display() print user_info_obj.userprofile.passworduser_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first() print user_info_obj.keys() print user_info_obj.values()

    一對多操作,類似于一對一:

    1、搜索條件使用 __ 連接 2、獲取值時使用 . 連接

    多對多操作:

    user_info_obj = models.UserInfo.objects.get(name=u'拉拉') user_info_objs = models.UserInfo.objects.all()group_obj = models.UserGroup.objects.get(caption='CEO') group_objs = models.UserGroup.objects.all()# 添加數據 #group_obj.user_info.add(user_info_obj) #group_obj.user_info.add(*user_info_objs)# 刪除數據 #group_obj.user_info.remove(user_info_obj) #group_obj.user_info.remove(*user_info_objs)# 添加數據 #user_info_obj.usergroup_set.add(group_obj) #user_info_obj.usergroup_set.add(*group_objs)# 刪除數據 #user_info_obj.usergroup_set.remove(group_obj) #user_info_obj.usergroup_set.remove(*group_objs)# 獲取數據 #print group_obj.user_info.all() #print group_obj.user_info.all().filter(id=1)# 獲取數據 #print user_info_obj.usergroup_set.all() #print user_info_obj.usergroup_set.all().filter(caption='CEO') #print user_info_obj.usergroup_set.all().filter(caption='DBA')

    其他操作:

    # F 使用查詢條件的值# # from django.db.models import F# models.Tb1.objects.update(num=F('num')+1)# Q 構建搜索條件from django.db.models import Q# con = Q()# # q1 = Q()# q1.connector = 'OR'# q1.children.append(('id', 1))# q1.children.append(('id', 10))# q1.children.append(('id', 9))# # q2 = Q()# q2.connector = 'OR'# q2.children.append(('c1', 1))# q2.children.append(('c1', 10))# q2.children.append(('c1', 9))# # con.add(q1, 'AND')# con.add(q2, 'AND')# # models.Tb1.objects.filter(con)# # from django.db import connection# cursor = connection.cursor()# cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])# row = cursor.fetchone()

    xx_set中的_set是多對多的固定搭配

    三、擴展

    自定義上傳:

    def upload_file(request):if request.method == "POST":obj = request.FILES.get('fafafa')f = open(obj.name, 'wb')for chunk in obj.chunks():f.write(chunk)f.close()return render(request, 'file.html')

    form上傳文件實例

    class FileForm(forms.Form):ExcelFile = forms.FileField()

    models.py

    from django.db import modelsclass UploadFile(models.Model):userid = models.CharField(max_length = 30)file = models.FileField(upload_to = './upload/')date = models.DateTimeField(auto_now_add=True)

    view.py

    def UploadFile(request):uf = AssetForm.FileForm(request.POST,request.FILES)if uf.is_valid():upload = models.UploadFile()upload.userid = 1upload.file = uf.cleaned_data['ExcelFile']upload.save()print upload.file

    ?

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/xiaobucainiao/p/6178702.html

    總結

    以上是生活随笔為你收集整理的Django框架Day3------之Models的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。