一、建立model表
基本結構html
from django.db import models class userinfo(models.Model): #若是沒有models.AutoField,默認會建立一個id的自增列 name = models.CharField(max_length = 30 ) email = models.EmailField() memo = models.TextField()
更多字段:python
1 、models.AutoField 自增列 = int ( 11 ) 若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key = True 。 2 、models.CharField 字符串字段 必須 max_length 參數 3 、models.BooleanField 布爾類型 = tinyint( 1 ) 不能爲空,Blank = True 4 、models.ComaSeparatedIntegerField 用逗號分割的數字 = varchar 繼承CharField,因此必須 max_lenght 參數 5 、models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。 6 、models.DateTimeField 日期類型 datetime 同DateField的參數 7 、models.Decimal 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places 8 、models.EmailField 字符串類型(正則表達式郵箱) = varchar 對字符串進行正則表達式 9 、models.FloatField 浮點類型 = double 10 、models.IntegerField 整形 11 、models.BigIntegerField 長整形 integer_field_ranges = { 'SmallIntegerField' :( - 32768 , 32767 ), 'IntegerField' :( - 2147483648 , 2147483647 ), 'BigIntegerField' :( - 9223372036854775808 , 9223372036854775807 ), 'PositiveSmallIntegerField' :( 0 , 32767 ), 'PositiveIntegerField' :( 0 , 2147483647 ), } 12 、models.IPAddressField 字符串類型(ip4正則表達式) 13 、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的) 參數protocol能夠是:both、ipv四、ipv6 驗證時,會根據設置報錯 14 、models.NullBooleanField 容許爲空的布爾類型 15 、models.PositiveIntegerFiel 正Integer 16 、models.PositiveSmallIntegerField 正smallInteger 17 、models.SlugField 減號、下劃線、字母、數字 18 、models.SmallIntegerField 數字 數據庫中的字段有:tinyint、smallint、 int 、bigint 19 、models.TextField 字符串 = longtext 20 、models.TimeField 時間 HH:MM[:ss[.uuuuuu]] 21 、models.URLField 字符串,地址正則表達式 22 、models.BinaryField 二進制 23 、models.ImageField圖片 24 、models.FilePathField文件
更多參數
mysql
1 、null = True 數據庫中字段是否能夠爲空 2 、blank = True django的Admin中添加數據時是否可容許空值 3 、primary_key = False 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列 4 、auto_now 和 auto_now_add auto_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
二、註冊APP,settings添加app
三、生成相應的表git
python manage.py makemigrations
python manage.py migrate
四、admin後臺註冊表web
python manage.py createsuperuser 建立用戶
後臺能夠管理,添加數據正則表達式
對數據進行增刪改查sql
models.UserInfo.objects.all() models.UserInfo.objects.all().values('user') #只取user列 models.UserInfo.objects.all().values_list('id','user') #取出id和user列,並生成一個列表 models.UserInfo.objects.get(id=1) models.UserInfo.objects.get(user='yangmv')
成功獲取數據數據庫
models.UserInfo.objects.create(user='yangmv',pwd='123456') 或者 obj = models.UserInfo(user='yangmv',pwd='123456') obj.save() 或者 dic = {'user':'yangmv','pwd':'123456'} models.UserInfo.objects.create(**dic)
models.UserInfo.objects.filter(user='yangmv').delete()
models.UserInfo.objects.filter(user='yangmv').update(pwd='520') 或者 obj = models.UserInfo.objects.get(user='yangmv') obj.pwd = '520' obj.save()
經常使用方法django
# 獲取個數 # # 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等於十一、2二、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 from django.db.models import Count, Min , Max , Sum # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" django中models的filter過濾方法 __gt 大於 __gte 大於等於 __lt 小於 __lte 小於等於 __in 存在於一個list範圍內 __startswith 以...開頭 __istartswith 以...開頭忽略大小寫 __endswith 以...結尾 __iendswith 以...結尾,忽略大小寫 __range 在...範圍內 __year 日期字段的年份 __month 日期字段的月份 __day 日期字段的日 __isnull=True/False __overlap 集合至少有一個元素重合 __contains 集合包含 __regex 匹配正則表達
2、經常使用字段app
models.DateTimeField 日期類型 datetime
參數,
auto_now = True :則每次更新都會更新這個時間 auto_now_add 則只是第一次建立添加,以後的更新再也不改變。 class UserInfo(models.Model): name = models.CharField(max_length = 32 ) ctime = models.DateTimeField(auto_now = True ) uptime = models.DateTimeField(auto_now_add = True )
from web import models def home(request): models.UserInfo.objects.create(name = 'yangmv' ) after = models.UserInfo.objects. all () print after[ 0 ].ctime return render(request, 'home/home.html' )
表結構的修改
表結構修改後,原來表中已存在的數據,就會出現結構混亂,makemigrations更新表的時候就會出錯
解決方法:
一、新增長的字段,設置容許爲空。生成表的時候,以前數據新增長的字段就會爲空。(null=True容許數據庫中爲空,blank=True容許admin後臺中爲空)
二、新增長的字段,設置一個默認值。生成表的時候,以前的數據新增長字段就會應用這個默認值
執行makemigrations, migrate 後。老數據會自動應用新增長的規則
models.ImageField 圖片 models.GenericIPAddressField IP ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True) img = models.ImageField(null=True,blank=True,upload_to="upload")
數據庫中保存的只是圖片的路徑
經常使用參數
選擇下拉框 choices
class UserInfo(models.Model): USER_TYPE_LIST = ( (1,'user'), (2,'admin'), ) user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)
二、連表結構
一對多:models.ForeignKey(其餘表)
多對多:models.ManyToManyField(其餘表)
一對一:models.OneToOneField(其餘表)
應用場景:
一對多:當一張表中建立一行數據時,有一個單選的下拉框(能夠被重複選擇)
例如:建立用戶信息時候,須要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
多對多:在某表中建立一行數據是,有一個能夠多選的下拉框
例如:建立用戶信息,須要爲用戶指定多個愛好
一對一:在某表中建立一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了
例如:原有含10列數據的一張表保存相關信息,通過一段時間以後,10列沒法知足需求,須要爲原來的表再添加5列數據
class Game(models.Model): gname = models.CharField(max_length = 32 ) class Host(models.Model): hostname = models.CharField(max_length = 32 ) game = models.ForeignKey( 'Game' )
這是Game表,裏面有3個業務
這是主機表,能夠經過外鍵,對應到Game表的業務的ID
class UserGroup(models.Model): group_name = models.CharField(max_length = 16 ) class User(models.Model): name = models.CharField(max_length = 16 ) sex = models.CharField(max_length = 16 ) email = models.EmailField(max_length = 32 ) usergroup_user = models.ManyToManyField( 'UserGroup' )
Django model會自動建立第3張關係表,用於對應user id 和usergroup id
這是UserGroup表
這是User表
這是Django自動生成的對應關係表
user_id = 1 爲 yangmv,同時屬於1,2(技術部,運營部)
class User2(models.Model): name = models.CharField(max_length = 16 ) sex = models.CharField(max_length = 16 ) email = models.EmailField(max_length = 32 ) class Admin(models.Model): username = models.CharField(max_length = 32 ) password = models.CharField(max_length = 32 ) admin_user2 = models.OneToOneField( 'User2' )
DATABASES = { 'default' :{ 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'dbname' , 'USER' : 'root' , 'PASSWORD' : 'xxx' , 'HOST' :'', 'PORT' :'', } }
一對多操做實例
首先生成2個表
from django.db import models class Group2(models.Model): caption = models.CharField(max_length = 32 ) class User2(models.Model): username = models.CharField(max_length = 32 ) group2 = models.ForeignKey( 'Group2' ) input和select標籤用forms生成
先執行create_group生成3個group
已經查詢出Group數據
方法1,方法2
def create_user(request): obj = Forign.UserForm(request.POST) if request.method = = 'POST' : if obj.is_valid(): all_data = obj.clean() #print all_data #獲取提交頁面提交來的數據{'username': u'yang1', 'usergroup': 1} #方法1,先獲取對象,添加 #group_obj = models.Group2.objects.get(id=all_data['usergroup']) #models.User2.objects.create(username=all_data['username'],usergroup=group_obj) #方法2(推薦) models.User2.objects.create(username = all_data[ 'username' ],group2_id = all_data[ 'usergroup' ]) #django會自動把數據庫group2變爲group2_id else : error = obj.errors print error[ 'username' ][ 0 ] print error[ 'usergroup' ][ 0 ] return render(request, 'forign/create_user.html' ,{ 'obj' :obj})
方法3
def create_user(request): obj = Forign.UserForm(request.POST) if request.method = = 'POST' : if obj.is_valid(): all_data = obj.clean() #print all_data #獲取提交頁面提交來的數據{'username': u'yang1', 'usergroup': 1} #方法1,先獲取對象,添加 #group_obj = models.Group2.objects.get(id=all_data['usergroup']) #models.User2.objects.create(username=all_data['username'],usergroup=group_obj) #方法2(推薦) #models.User2.objects.create(username=all_data['username'],group2_id=all_data['usergroup']) #django會自動把數據庫group2變爲group2_id #方法3(推薦) models.User2.objects.create( * * all_data) print models.User2.objects. all ().count() else : pass # error = obj.errors # print error['username'][0] # print error['usergroup_id'][0] return render(request, 'forign/create_user.html' ,{ 'obj' :obj})
def create_user(request): obj = Forign.UserForm(request.POST) if request.method = = 'POST' : if obj.is_valid(): all_data = obj.clean() #方法3(推薦) models.User2.objects.create( * * all_data) print models.User2.objects. all ().count() else : pass user_list = models.User2.objects. all () return render(request, 'forign/create_user.html' ,{ 'obj' :obj, 'user_list' :user_list})
< table border="1"> {% for item in user_list %} < tr > < td >{{ item.username }}</ td > < td >{{ item.group2.caption }}</ td > </ tr > {% endfor %} </ table >
def create_user(request): obj = Forign.UserForm(request.POST) if request.method = = 'POST' : if obj.is_valid(): all_data = obj.clean() #方法3(推薦) models.User2.objects.create( * * all_data) print models.User2.objects. all ().count() else : pass #查用戶 get_user = request.GET.get( 'username' ) user_list = models.User2.objects. filter (username = get_user) return render(request, 'forign/create_user.html' ,{ 'obj' :obj, 'user_list' :user_list})
#查組 get_val = request.GET.get( 'group' ) user_list = models.User2.objects. filter (group2__caption = get_val)
一、group2對應的是一個對象二、建立數據 group2_id ,直接查詢數據庫三、獲取數據,經過. group2.caption四、查詢數據,經過__ group2__caption