django orm 建表字段
在django modle 中,我們定義的類,他的對象就是數據庫表中的一行數據!!!
django orm 基礎
一:modle的各個字段:
在python中以code first,所以在python中用類和對象,來調用底層數據庫API來操作數據庫。
1:創建數據庫:
數據庫配置寫在:子應用的:modles.py配置文件中。
需要注意的時候app需要注冊。在setting中。
默認情況下,使用的數據庫是sqllite3.
創建類:
1 from django.db import models 2 3 # Create your models here. 4 class Userinfo(models.Model): 5 ''' 6 功能:該類主要功能是創建用戶的信息表格。 7 ''' 8 user=models.CharField(max_length=12) 9 password=models.CharField(max_length=40) 10 ipone_num=models.CharField(max_length=12) 11 12 13 class Hostinfo(models.Model): 14 ''' 15 功能:該類為用戶錄入主機數據表格。 16 ''' 17 host=models.CharField(max_length=32) 18 address=models.CharField(max_length=32,default="馬駒橋機房") 19 ip=models.CharField(max_length=34) 20 stat=models.CharField(max_length=32) 21 prot=models.CharField(max_length=32) 22 service=models.CharField(max_length=32,default='商城業務') 23 department=models.CharField(max_length=32,default="應用運維") 24 mac_info=models.CharField(max_length=32,default="00-av-tv-cctv") 25 pingpai=models.CharField(max_length=32,default="IBM") 26 sn=models.CharField(max_length=32,default="dad13sda")
類中各個字段含義:
1 1、models.AutoField 自增列 = int(11) 2 如果沒有的話,默認會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須將給列設置為主鍵 primary_key=True。 3 2、models.CharField 字符串字段 4 必須 max_length 參數 5 3、models.BooleanField 布爾類型=tinyint(1) 6 不能為空,Blank=True 7 4、models.ComaSeparatedIntegerField 用逗號分割的數字=varchar 8 input: 12,345,989871234, 9 10 繼承CharField,所以必須 max_lenght 參數 11 5、models.DateField 日期類型 date 12 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次創建添加,之后的更新不再改變。 13 6、models.DateTimeField 日期類型 datetime 14 同DateField的參數 15 7、models.Decimal 十進制小數類型 = decimal 16 必須指定整數位max_digits和小數位decimal_places 17 8、models.EmailField 字符串類型(正則表達式郵箱) =varchar 18 對字符串進行正則表達式 19 9、models.FloatField 浮點類型 = double 20 10、models.IntegerField 整形 21 11、models.BigIntegerField 長整形 22 integer_field_ranges = { 23 'SmallIntegerField': (-32768, 32767), 24 'IntegerField': (-2147483648, 2147483647), 25 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 26 'PositiveSmallIntegerField': (0, 32767), 27 'PositiveIntegerField': (0, 2147483647), 28 } 29 12、models.IPAddressField 字符串類型(ip4正則表達式) 30 13、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的) 31 參數protocol可以是:both、ipv4、ipv6 32 驗證時,會根據設置報錯 33 14、models.NullBooleanField 允許為空的布爾類型 34 15、models.PositiveIntegerFiel 正Integer 35 16、models.PositiveSmallIntegerField 正smallInteger 36 17、models.SlugField 減號、下划線、字母、數字 37 18、models.SmallIntegerField 數字 38 數據庫中的字段有:tinyint、smallint、int、bigint 39 19、models.TextField 字符串=longtext 40 20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]] 41 21、models.URLField 字符串,地址正則表達式 42 22、models.BinaryField 二進制 43 44 23、models.ImageField 圖片 字符串 45 24、models.FilePathField 文件 字符串
需要注意的是:
1 models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次創建添加,之后的更新不再改變。
根絕自己的需要來定義這個字段和使用相應的參數。
1 class Title(models.Model): 2 title=models.CharField(max_length=32) 3 add_date=models.DateField(auto_now=True)#表示該表進行數據的插入的時候時間,當前行的數據插入的時間。 4 update_date=models.DateField(auto_now_add=True)#表示該表的該行數據進行更新的時候,記錄時間。
還有字段:models.ImageField 和、models.FilePathField在數據庫中保存的是圖片和文件的的路徑。
默認情況下,如果我們不指定創建 自增列(主鍵)的話,在數據庫中,默認會給我們創建一個名為:id的自增列。
更多參數:
1 1、null=True 2 數據庫中字段是否可以為空 3 2、blank=True 4 django的 Admin 中添加數據時是否可允許空值 5 3、primary_key = False 6 主鍵,對AutoField設置主鍵后,就會代替原來的自增 id 列 7 4、auto_now 和 auto_now_add 8 auto_now 自動創建---無論添加或修改,都是當前操作的時間 9 auto_now_add 自動創建---永遠是創建時的時間 10 5、choices 11 GENDER_CHOICE = ( 12 (u'M', u'Male'), 13 (u'F', u'Female'), 14 ) 15 gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 16 6、max_length 17 7、default 默認值 18 8、verbose_name Admin中字段的顯示名稱 19 9、name|db_column 數據庫中的字段名稱 20 10、unique=True 不允許重復 21 11、db_index = True 數據庫索引 22 12、editable=True 在Admin里是否可編輯 23 13、error_messages=None 錯誤提示 24 14、auto_created=False 自動創建 25 15、help_text 在Admin中提示幫助信息 26 16、validators=[] 27 17、upload-to 28 29 更多參數
可以給我們的列設置默認值。default=''
1 email = models.EmailField() # string,幫助admin做輸入驗證,modelform
創建完,類,我們進行數據庫的創建:執行如下2條命令!
1 python manage.py makemigrations 2 python manage.py migrate
choices:比如說性別:要么是男要么是女。如果有如下表:
1 class Gender(models.Model): 2 name=models.CharField(max_length=32) 3 4 class User_type(models.Model): 5 user_type=models.CharField(max_length=32) 6 nid=models.AutoField(primary_key=True) 7 phone_num=models.IntegerField() 8 phone_num_1=models.IntegerField() 9 gender=models.ForeignKey('Gender')
因為性別是不會改變的。如果按如上的操作,用戶類型和性別表建立多對一的情況,那么在我們查詢的時候,會給數據庫增加壓力,這時候我們可以考慮用choices。用元組來表示這個字段,用0、1來表示性別。用內存儲存的元組的來
減少表的跨表查詢。
1 gender_choices=( 2 (0,'男'), 3 (1,'女'), 4 ) 5 6 class User_type(models.Model): 7 user_type=models.CharField(max_length=32) 8 nid=models.AutoField(primary_key=True) 9 phone_num=models.IntegerField() 10 phone_num_1=models.IntegerField() 11 gender=models.IntegerField(choices=gender_choices)#前端頁面顯示的是男女,而實際上數據庫記錄的是:0和1,減少數據庫的連表操作。
2:django中如果我們想修改,表結構,比如增加一個列,在之前的sqlalchemy中只能借助於第三的模塊或者工具,但是在django中,不需要。只需要再執行如下命令既可修改表結構:
1 1 python manage.py makemigrations 2 2 python manage.py migrate
但是在執行如下的命令的時候,需要在對應的類(表)中設置相應的default的值。否則會報錯。需要注意的是:報如下錯誤,前提是該數據庫已經插入數據!!!否則不會報錯。
解決方法:在相應的類中增加的列的中,填寫默認數據:default="值",在運行命令的時候不會報錯。
1 class Title(models.Model): 2 title=models.CharField(max_length=32) 3 add_date=models.DateField(auto_now_add=True)#表示該表進行數據的插入的時候時間,當前行的數據插入的時間。 4 update_date=models.DateField(auto_now=True)#表示該表的該行數據進行更新的時候,記錄時間。 5 content=models.CharField(max_length=200,default="大話西游,永恆的經典!")
1 Hostinfo.objects.filter(id=val).values(id) 2 Hostinfo.objects.filter(id=val).value_list(id,email)
value:獲取結果不是對象的列表的集合。內部小元素是字典,而是列表中嵌套字典。[{'id':2},{'id':1}]
valuelist:是獲取元組的集合內嵌套元組,內部小元素是元組。((2,'1@qq.com'),(1,'2@qq.com'))