mysql 中caption_Django-Model操作数据库(增删改查、连表结构)(示例代码)
Django-Model操作數據庫(增刪改查、連表結構)
一、數據庫操作
1、創建model表
基本結構
from django.db importmodelsclassuserinfo(models.Model):#如果沒有models.AutoField,默認會創建一個id的自增列
name = models.CharField(max_length = 30)
email=models.EmailField()
memo= models.TextField()
更多字段:
1 、models.AutoField 自增列 = int ( 11)
如果沒有的話,默認會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須將給列設置為主鍵 primary_key=True 。2、models.CharField 字符串字段
必須 max_length 參數3 、models.BooleanField 布爾類型 = tinyint( 1)
不能為空,Blank=True4 、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_places8 、models.EmailField 字符串類型(正則表達式郵箱) =varchar
對字符串進行正則表達式9 、models.FloatField 浮點類型 =double10、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、ipv4、ipv6
驗證時,會根據設置報錯14、models.NullBooleanField 允許為空的布爾類型15、models.PositiveIntegerFiel 正Integer16、models.PositiveSmallIntegerField 正smallInteger17、models.SlugField 減號、下劃線、字母、數字18、models.SmallIntegerField 數字
數據庫中的字段有:tinyint、smallint、 int 、bigint19 、models.TextField 字符串 =longtext20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]21、models.URLField 字符串,地址正則表達式22、models.BinaryField 二進制23、models.ImageField圖片24 、models.FilePathField文件
更多參數
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_length7、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
2、注冊APP,settings添加app
3、生成相應的表
python manage.py makemigrations
python manage.py migrate
4、admin后臺注冊表
python manage.py createsuperuser 創建用戶
后臺可以管理,添加數據
對數據進行增刪改查
查
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()
常用方法
#獲取個數#
#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
from django.db.models importCount, 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 匹配正則表達
二、常用字段
models.DateTimeField 日期類型 datetime
參數,
auto_now =True :則每次更新都會更新這個時間
auto_now_add 則只是第一次創建添加,之后的更新不再改變。classUserInfo(models.Model):
name= models.CharField(max_length = 32)
ctime= models.DateTimeField(auto_now =True )
uptime= models.DateTimeField(auto_now_add = True )
from web importmodelsdefhome(request):
models.UserInfo.objects.create(name= ‘yangmv‘)
after=models.UserInfo.objects. all ()printafter[ 0 ].ctimereturn render(request, ‘home/home.html‘ )
表結構的修改
表結構修改后,原來表中已存在的數據,就會出現結構混亂,makemigrations更新表的時候就會出錯
解決方法:
1、新增加的字段,設置允許為空。生成表的時候,之前數據新增加的字段就會為空。(null=True允許數據庫中為空,blank=True允許admin后臺中為空)
2、新增加的字段,設置一個默認值。生成表的時候,之前的數據新增加字段就會應用這個默認值
執行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
classUserInfo(models.Model):
USER_TYPE_LIST=(
(1,‘user‘),
(2,‘admin‘),
)
user_type= models.IntegerField(choices=USER_TYPE_LIST,default=1)
2、連表結構
一對多:models.ForeignKey(其他表)
多對多:models.ManyToManyField(其他表)
一對一:models.OneToOneField(其他表)
應用場景:
一對多:當一張表中創建一行數據時,有一個單選的下拉框(可以被重復選擇)
例如:創建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
多對多:在某表中創建一行數據是,有一個可以多選的下拉框
例如:創建用戶信息,需要為用戶指定多個愛好
一對一:在某表中創建一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了
例如:原有含10列數據的一張表保存相關信息,經過一段時間之后,10列無法滿足需求,需要為原來的表再添加5列數據
一對多:
classGame(models.Model):
gname= models.CharField(max_length = 32)classHost(models.Model):
hostname= models.CharField(max_length = 32)
game= models.ForeignKey( ‘Game‘ )
這是Game表,里面有3個業務
這是主機表,可以通過外鍵,對應到Game表的業務的ID
多對多:
classUserGroup(models.Model):
group_name= models.CharField(max_length = 16)classUser(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(技術部,運營部)
一對一: (一對多增加了不能重復)
classUser2(models.Model):
name= models.CharField(max_length = 16)
sex= models.CharField(max_length = 16)
email= models.EmailField(max_length = 32)classAdmin(models.Model):
username= models.CharField(max_length = 32)
password= models.CharField(max_length = 32)
admin_user2= models.OneToOneField( ‘User2‘ )
連接Mysql
DATABASES ={‘default‘:{‘ENGINE‘ : ‘django.db.backends.mysql‘,‘NAME‘ : ‘dbname‘,‘USER‘ : ‘root‘,‘PASSWORD‘ : ‘xxx‘,‘HOST‘ :‘‘,‘PORT‘ :‘‘,
}
}
一對多操作實例
首先生成2個表
from django.db importmodelsclassGroup2(models.Model):
caption= models.CharField(max_length = 32)classUser2(models.Model):
username= models.CharField(max_length = 32)
group2= models.ForeignKey( ‘Group2‘)
input和select標簽用forms生成
先執行create_group生成3個group
已經查詢出Group數據
添加
方法1,方法2
defcreate_user(request):
obj=Forign.UserForm(request.POST)if request.method = = ‘POST‘:ifobj.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.errorsprint error[ ‘username‘][ 0 ]print error[ ‘usergroup‘][ 0 ]return render(request, ‘forign/create_user.html‘ ,{ ‘obj‘ :obj})
方法3
defcreate_user(request):
obj=Forign.UserForm(request.POST)if request.method = = ‘POST‘:ifobj.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)printmodels.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})
查詢。展示出所有的數據
defcreate_user(request):
obj=Forign.UserForm(request.POST)if request.method = = ‘POST‘:ifobj.is_valid():
all_data=obj.clean()#方法3(推薦)
models.User2.objects.create( * *all_data)printmodels.User2.objects. all ().count()else:passuser_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 >
GET方式查詢
defcreate_user(request):
obj=Forign.UserForm(request.POST)if request.method = = ‘POST‘:ifobj.is_valid():
all_data=obj.clean()#方法3(推薦)
models.User2.objects.create( * *all_data)printmodels.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)
一對多跨表操作,總結
1、group2對應的是一個對象
2、創建數據 group2_id ,直接查詢數據庫
3、獲取數據,通過. group2.caption
4、查詢數據,通過__ group2__caption
總結
以上是生活随笔為你收集整理的mysql 中caption_Django-Model操作数据库(增删改查、连表结构)(示例代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive mysql5.7_安装并使用m
- 下一篇: 倒计时css和js html代码,手把手