Django框架Day3------之Models
一、Django models字段類型清單:
AutoField:一個(gè)自動(dòng)遞增的整型字段,添加記錄時(shí)它會(huì)自動(dòng)增長(zhǎng)。你通常不需要直接使用這個(gè)字段;如果你不指定主鍵的話,系統(tǒng)會(huì)自動(dòng)添加一個(gè)主鍵字段到你的model。(參閱自動(dòng)主鍵字段)
BooleanField:布爾字段,管理工具里會(huì)自動(dòng)將其描述為checkbox。
CharField:字符串字段,單行輸入,用于較短的字符串,如要保存大量文本, 使用 TextField,CharField有一個(gè)必填參數(shù):
CharField.max_length:字符的最大長(zhǎng)度,django會(huì)根據(jù)這個(gè)參數(shù)在數(shù)據(jù)庫(kù)層和校驗(yàn)層限制該字段所允許的最大字符數(shù)。
TextField:一個(gè)容量很大的文本字段,?admin 管理界面用 <textarea>多行編輯框表示該字段數(shù)據(jù)。
CommaSeparatedIntegerField:用于存放逗號(hào)分隔的整數(shù)值。類似 CharField,必須maxlength 參數(shù)。
DateField:日期字段,admin 用一個(gè)文本框 <input type=”text”> 來(lái)表示該字段數(shù)據(jù)(附帶一個(gè) JavaScript 日歷和一個(gè)”Today”快捷按鍵。有下列額外的可選參數(shù):
auto_now:當(dāng)對(duì)象被保存時(shí),自動(dòng)將該字段的值設(shè)置為當(dāng)前時(shí)間.通常用于表示 “l(fā)ast-modified” 時(shí)間戳;
auto_now_add:當(dāng)對(duì)象首次被創(chuàng)建時(shí),自動(dòng)將該字段的值設(shè)置為當(dāng)前時(shí)間.通常用于表示對(duì)象創(chuàng)建時(shí)間。
DateTimeField:類似 DateField 支持同樣的附加選項(xiàng)。
EmailField:一個(gè)帶有檢查 Email 合法性的 CharField,不接受 maxlength 參數(shù)。
FileField:一個(gè)文件上傳字段。?要求一個(gè)必須有的參數(shù): upload_to, 一個(gè)用于保存上載文件的本地文件系統(tǒng)路徑。 這個(gè)路徑必須包含 strftime formatting, 該格式將被上載文件的 date/time 替換(so that uploaded files don’t fill up the given directory)。在一個(gè) model 中使用 FileField 或 ImageField 需要以下步驟:在你的 settings 文件中, 定義一個(gè)完整路徑給 MEDIA_ROOT 以便讓 Django在此處保存上傳文件。 (出于性能考慮,這些文件并不保存到數(shù)據(jù)庫(kù)。) 定義 MEDIA_URL 作為該目錄的公共 URL。 要確保該目錄對(duì) WEB 服務(wù)器用戶帳號(hào)是可寫的。在你的 model 中添加 FileField 或 ImageField, 并確保定義了 upload_to 選項(xiàng),以告訴 Django 使用 MEDIA_ROOT 的哪個(gè)子目錄保存上傳文件。你的數(shù)據(jù)庫(kù)中要保存的只是文件的路徑(相對(duì)于 MEDIA_ROOT)。 出于習(xí)慣你一定很想使用 Django 提供的 get_<fieldname>_url 函數(shù)。舉例來(lái)說(shuō),如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object。get_mug_shot_url }} 這樣的方式得到圖像的絕對(duì)路徑。
FilePathField:選擇指定目錄按限制規(guī)則選擇文件,有三個(gè)參數(shù)可選, 其中”path”必需的,這三個(gè)參數(shù)可以同時(shí)使用,?參數(shù)描述:
path:必需參數(shù),一個(gè)目錄的絕對(duì)文件系統(tǒng)路徑。 FilePathField 據(jù)此得到可選項(xiàng)目。 Example: “/home/images”;
match:可選參數(shù), 一個(gè)正則表達(dá)式, 作為一個(gè)字符串, FilePathField 將使用它過(guò)濾文件名。 注意這個(gè)正則表達(dá)式只會(huì)應(yīng)用到 base filename 而不是路徑全名。 Example: “foo。*\。txt^”, 將匹配文件 foo23.txt 卻不匹配 bar.txt 或 foo23.gif;
recursive:可選參數(shù), 是否包括 path 下全部子目錄,True 或 False,默認(rèn)值為 False。
match 僅應(yīng)用于 base filename, 而不是路徑全名。 如:FilePathField(path=”/home/images”, match=”foo.*”, recursive=True)…會(huì)匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
?
FloatField:浮點(diǎn)型字段。 必須提供兩個(gè)參數(shù),參數(shù)描述:
max_digits:總位數(shù)(不包括小數(shù)點(diǎn)和符號(hào))
decimal_places:小數(shù)位數(shù)。如:要保存最大值為 999 (小數(shù)點(diǎn)后保存2位),你要這樣定義字段:models.FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百萬(wàn)(小數(shù)點(diǎn)后保存10位)的話,你要這樣定義:models.FloatField(…,max_digits=19, decimal_places=10)
ImageField:類似 FileField, 不過(guò)要校驗(yàn)上傳對(duì)象是否是一個(gè)合法圖片。它有兩個(gè)可選參數(shù):height_field 和 width_field,如果提供這兩個(gè)參數(shù),則圖片將按提供的高度和寬度規(guī)格保存。?該字段要求 Python Imaging 庫(kù)。
IntegerField:用于保存一個(gè)整數(shù)。
IPAddressField:一個(gè)字符串形式的 IP 地址, (如 “202.1241.30″)。
NullBooleanField:類似 BooleanField, 不過(guò)允許 NULL 作為其中一個(gè)選項(xiàng)。 推薦使用這個(gè)字段而不要用 BooleanField 加 null=True 選項(xiàng)。?admin 用一個(gè)選擇框 <select> (三個(gè)可選擇的值: “Unknown”, “Yes” 和 “No” ) 來(lái)表示這種字段數(shù)據(jù)。
PhoneNumberField:一個(gè)帶有合法美國(guó)風(fēng)格電話號(hào)碼校驗(yàn)的 CharField(格式:XXX-XXX-XXXX)。
PositiveIntegerField:類似 IntegerField, 但取值范圍為非負(fù)整數(shù)(這個(gè)字段應(yīng)該是允許0值的…可以理解為無(wú)符號(hào)整數(shù))
PositiveSmallIntegerField:正小整型字段,類似 PositiveIntegerField, 取值范圍較小(數(shù)據(jù)庫(kù)相關(guān))SlugField“Slug” 是一個(gè)報(bào)紙術(shù)語(yǔ)。 slug 是某個(gè)東西的小小標(biāo)記(短簽), 只包含字母、數(shù)字、下劃線和連字符。它們通常用于URLs。?若你使用 Django 開發(fā)版本,你可以指定 maxlength。 若 maxlength 未指定, Django 會(huì)使用默認(rèn)長(zhǎng)度: 50,它接受一個(gè)額外的參數(shù):
prepopulate_from: 來(lái)源于slug的自動(dòng)預(yù)置列表
SlugField:是一個(gè)報(bào)紙術(shù)語(yǔ). slug 是某個(gè)東西的小小標(biāo)記(短簽), 只包含字母,數(shù)字,下劃線和連字符.它們通常用于URLs。
SmallIntegerField:類似 IntegerField, 不過(guò)只允許某個(gè)取值范圍內(nèi)的整數(shù)。(依賴數(shù)據(jù)庫(kù))
TimeField:時(shí)間字段,類似于 DateField 和?DateTimeField。
URLField:用于保存 URL。 若 verify_exists 參數(shù)為 True (默認(rèn)), 給定的 URL 會(huì)預(yù)先檢查是否存在(即URL是否被有效裝入且沒(méi)有返回404響應(yīng))。
USStateField:美國(guó)州名縮寫,由兩個(gè)字母組成(天朝人民無(wú)視)。
XMLField:XML字符字段,校驗(yàn)值是否為合法XML的 TextField,必須提供參數(shù):
schema_path:校驗(yàn)文本的 RelaxNG schema 的文件系統(tǒng)路徑。
附:Field 選項(xiàng)
-
null :缺省設(shè)置為false.通常不將其用于字符型字段上,比如CharField,TextField上.字符型字段如果沒(méi)有值會(huì)返回空字符串。
-
blank:該字段是否可以為空。如果為假,則必須有值
-
choices:一個(gè)用來(lái)選擇值的2維元組。第一個(gè)值是實(shí)際存儲(chǔ)的值,第二個(gè)用來(lái)方便進(jìn)行選擇。如SEX_CHOICES= ((‘F’,'Female’),(‘M’,'Male’),)
-
core:db_column,db_index?如果為真將為此字段創(chuàng)建索引
-
default:設(shè)定缺省值
-
editable:如果為假,admin模式下將不能改寫。缺省為真
-
help_text:admin模式下幫助文檔
-
primary_key:設(shè)置主鍵,如果沒(méi)有設(shè)置django創(chuàng)建表時(shí)會(huì)自動(dòng)加上:
-
- radio_admin:用于admin模式下將select轉(zhuǎn)換為radio顯示。只用于ForeignKey或者設(shè)置了choices
- unique:數(shù)據(jù)唯一
- unique_for_date:日期唯一,如下例中系統(tǒng)將不允許title和pub_date兩個(gè)都相同的數(shù)據(jù)重復(fù)出現(xiàn)
- title =?meta.CharField(maxlength=30,unique_for_date=’pub_date’)
- unique_for_month / unique_for_year:用法同上
- validator_list:有效性檢查。非有效產(chǎn)生 django.core.validators.ValidationError 錯(cuò)誤
附代碼 參考:
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'網(wǎng)絡(luò)班'), 12 ('offline_weekend',u'面授班(周末)',), 13 ('offline_fulltime',u'面授班(脫產(chǎn))',), 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'內(nèi)部轉(zhuǎn)介紹'), 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'已報(bào)名'), 52 ('unregistered',u'未報(bào)名'), 53 ('graduated',u'已畢業(yè)'), 54 ('drop-off',u'退學(xué)'), 55 ) 56 status = models.CharField(choices=status_choices,max_length=64) 57 consultant = models.ForeignKey('UserProfile',verbose_name=u'課程顧問(wèn)') 58 class_list = models.ManyToManyField('ClassList',blank=True) 59 date = models.DateField(u'咨詢?nèi)掌?/span>',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"近期無(wú)報(bào)名計(jì)劃"), 71 (2,u"2個(gè)月內(nèi)報(bào)名"), 72 (3,u"1個(gè)月內(nèi)報(bào)名"), 73 (4,u"2周內(nèi)報(bào)名"), 74 (5,u"1周內(nèi)報(bào)名"), 75 (6,u"2天內(nèi)報(bào)名"), 76 (7,u"已報(bào)名"), 77 ) 78 status = models.IntegerField(u"狀態(tài)",choices=status_choices,help_text=u"選擇客戶此時(shí)的狀態(tài)") 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'學(xué)期') 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'第幾節(jié)課') 112 course_date = models.DateField(auto_now_add=True, verbose_name=u'上課時(shí)間') 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"上課紀(jì)錄", 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"本節(jié)成績(jī)", 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更多參數(shù):
1、null=True數(shù)據(jù)庫(kù)中字段是否可以為空 2、blank=Truedjango的 Admin 中添加數(shù)據(jù)時(shí)是否可允許空值 3、primary_key = False主鍵,對(duì)AutoField設(shè)置主鍵后,就會(huì)代替原來(lái)的自增 id 列 4、auto_now 和 auto_now_addauto_now 自動(dòng)創(chuàng)建---無(wú)論添加或修改,都是當(dāng)前操作的時(shí)間auto_now_add 自動(dòng)創(chuàng)建---永遠(yuǎn)是創(chuàng)建時(shí)的時(shí)間 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 默認(rèn)值 8、verbose_name Admin中字段的顯示名稱 9、name|db_column 數(shù)據(jù)庫(kù)中的字段名稱 10、unique=True 不允許重復(fù) 11、db_index = True 數(shù)據(jù)庫(kù)索引 12、editable=True 在Admin里是否可編輯 13、error_messages=None 錯(cuò)誤提示 14、auto_created=False 自動(dòng)創(chuàng)建 15、help_text 在Admin中提示幫助信息 16、validators=[] 17、upload-to 上傳到哪個(gè)位置,更多與image,filepath配合使用連表結(jié)構(gòu)
應(yīng)用場(chǎng)景:
應(yīng)用場(chǎng)景:一對(duì)多:當(dāng)一張表中創(chuàng)建一行數(shù)據(jù)時(shí),有一個(gè)單選的下拉框(可以被重復(fù)選擇)例如:創(chuàng)建用戶信息時(shí)候,需要選擇一個(gè)用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。 多對(duì)多:在某表中創(chuàng)建一行數(shù)據(jù)是,有一個(gè)可以多選的下拉框例如:創(chuàng)建用戶信息,需要為用戶指定多個(gè)愛(ài)好 一對(duì)一:在某表中創(chuàng)建一行數(shù)據(jù)時(shí),有一個(gè)單選的下拉框(下拉框中的內(nèi)容被用過(guò)一次就消失了例如:原有含10列數(shù)據(jù)的一張表保存相關(guān)信息,經(jīng)過(guò)一段時(shí)間之后,10列無(wú)法滿足需求,需要為原來(lái)的表再添加5列數(shù)據(jù)注意:
1.models.py中class設(shè)置的數(shù)據(jù),本身返回一個(gè)類,如果想直接返回某一個(gè)字段的值,可以定義__unicode__,比如:
class TypeUser(models.Model):name = models.CharFiled(max_length=32)def __unicode__(self):return self.name2.在設(shè)置ForeignKey時(shí),參數(shù)中的第一個(gè)參數(shù)為表明,需要注意的是,加不加引號(hào)有區(qū)別,加引號(hào)后表的定義順序可以隨便,但不加引號(hào)必須按照順序來(lái)
3.多對(duì)多,有兩種創(chuàng)建方式
自動(dòng)創(chuàng)建,比如:
#自建第三張表 class B2G(models.Model):boy = models.ForeignKey('Boy')girl = models.ForeignKey('Girl')class Boy(models.Model):name = models.CharField(max_length=32)# 吳文煜,王建,王志剛,杜寶強(qiáng)class Girl(models.Model):name = models.CharField(max_length=32)#自動(dòng)創(chuàng)建f = models.ManyToManyField(Boy)4.queryset:從數(shù)據(jù)庫(kù)中提取出來(lái)的數(shù)據(jù)為queryset類型,是Django中的一種特殊類型
w = models.Simp.objects.all() print(w, type(w)) [<Simp: chenc>, <Simp: zan>, <Simp: zhangsan>]<class 'django.db.models.query.QuerySet'>可以看到,從數(shù)據(jù)庫(kù)取出個(gè)數(shù)據(jù)看起來(lái)像包含對(duì)象的列表。而實(shí)際上整個(gè)數(shù)據(jù)為django中的特殊類型QuerySet。
如果需要查看原來(lái)的SQL語(yǔ)句,可以使用queryset.query:
print(w.query)5.values() 和 vlue_list() 與 all()區(qū)別
.all()是取得所有列的數(shù)據(jù),可以加.values()取出某一列,每一個(gè)元素為一個(gè)字典:
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(),獲取到的元素為一個(gè)個(gè)元組,也可以加多個(gè)參數(shù)來(lái)獲取多列:
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') 增加一條數(shù)據(jù),可以接受字典類型數(shù)據(jù) **kwargs# obj = models.Tb1(c1='xx', c2='oo')# obj.save()# 查# # models.Tb1.objects.get(id=123) # 獲取單條數(shù)據(jù),不存在則報(bào)錯(cuò)(不建議)# models.Tb1.objects.all() # 獲取全部# models.Tb1.objects.filter(name='seven') # 獲取指定條件的數(shù)據(jù)# 刪# # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數(shù)據(jù)# 改# models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數(shù)據(jù)更新,均支持 **kwargs# obj = models.Tb1.objects.get(id=1)# obj.c1 = '111'# obj.save() # 修改單條數(shù)據(jù)2.進(jìn)階操作
利用雙下劃線將字段和對(duì)應(yīng)的操作連接起來(lái)(了不起的雙下劃線)
# 獲取個(gè)數(shù)# # 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的數(shù)據(jù)# 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前面就是為了根據(jù)id生成group by#需要固定導(dǎo)入,稱為聚合函數(shù)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將表之間的操作連接起來(lái)
數(shù)據(jù)庫(kù)表結(jié)構(gòu):
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'高級(jí)用戶'),)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一對(duì)一操作:
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()一對(duì)多操作,類似于一對(duì)一:
1、搜索條件使用 __ 連接 2、獲取值時(shí)使用 . 連接多對(duì)多操作:
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()# 添加數(shù)據(jù) #group_obj.user_info.add(user_info_obj) #group_obj.user_info.add(*user_info_objs)# 刪除數(shù)據(jù) #group_obj.user_info.remove(user_info_obj) #group_obj.user_info.remove(*user_info_objs)# 添加數(shù)據(jù) #user_info_obj.usergroup_set.add(group_obj) #user_info_obj.usergroup_set.add(*group_objs)# 刪除數(shù)據(jù) #user_info_obj.usergroup_set.remove(group_obj) #user_info_obj.usergroup_set.remove(*group_objs)# 獲取數(shù)據(jù) #print group_obj.user_info.all() #print group_obj.user_info.all().filter(id=1)# 獲取數(shù)據(jù) #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 構(gòu)建搜索條件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是多對(duì)多的固定搭配
三、擴(kuò)展
自定義上傳:
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上傳文件實(shí)例
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?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaobucainiao/p/6178702.html
總結(jié)
以上是生活随笔為你收集整理的Django框架Day3------之Models的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Tlist删除技巧
- 下一篇: 推荐eclipse插件Propertie