一、數(shù)據(jù)庫操作
1、創(chuàng)建model表
基本結(jié)構(gòu)
1
2
3
4
5
6
|
from django.db import models
class userinfo(models.Model):
#如果沒有 models.AutoField,,默認(rèn)會創(chuàng)建一個id的自增列
name = models.CharField(max_length = 30 )
email = models.EmailField()
memo = models.TextField()
|
更多字段:
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 1 ,、models.AutoField 自增列 = int ( 11 )
如果沒有的話,,默認(rèn)會生成一個名稱為 id 的列,,如果要顯示的自定義一個自增列,,必須將給列設(shè)置為主鍵 primary_key = True ,。
2 、models.CharField 字符串字段
必須 max_length 參數(shù)
3 ,、models.BooleanField 布爾類型 = tinyint( 1 )
不能為空,,Blank = True
4 、models.ComaSeparatedIntegerField 用逗號分割的數(shù)字 = varchar
繼承CharField,,所以必須 max_lenght 參數(shù)
5 ,、models.DateField 日期類型 date
對于參數(shù),auto_now = True 則每次更新都會更新這個時間,;auto_now_add 則只是第一次創(chuàng)建添加,,之后的更新不再改變。
6 ,、models.DateTimeField 日期類型 datetime
同DateField的參數(shù)
7 ,、models.Decimal 十進(jìn)制小數(shù)類型 = decimal
必須指定整數(shù)位max_digits和小數(shù)位decimal_places
8 、models.EmailField 字符串類型(正則表達(dá)式郵箱) = varchar
對字符串進(jìn)行正則表達(dá)式
9 ,、models.FloatField 浮點(diǎn)類型 = 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正則表達(dá)式)
13 ,、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的)
參數(shù)protocol可以是:both,、ipv4,、ipv6
驗證時,會根據(jù)設(shè)置報錯
14 ,、models.NullBooleanField 允許為空的布爾類型
15 ,、models.PositiveIntegerFiel 正Integer
16 、models.PositiveSmallIntegerField 正smallInteger
17 ,、models.SlugField 減號,、下劃線、字母,、數(shù)字
18 ,、models.SmallIntegerField 數(shù)字
數(shù)據(jù)庫中的字段有:tinyint,、smallint、 int ,、bigint
19 ,、models.TextField 字符串 = longtext
20 、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]
21 ,、models.URLField 字符串,,地址正則表達(dá)式
22 、models.BinaryField 二進(jìn)制
23 ,、models.ImageField圖片
24 ,、models.FilePathField文件
|
更多參數(shù)
2、注冊APP,,settings添加app
3,、生成相應(yīng)的表
python manage.py makemigrations
python manage.py migrate
4、admin后臺注冊表
python manage.py createsuperuser 創(chuàng)建用戶
后臺可以管理,,添加數(shù)據(jù)
對數(shù)據(jù)進(jìn)行增刪改查
查
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')
成功獲取數(shù)據(jù)
增
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.DateTimeField 日期類型 datetime
參數(shù),,
auto_now = True :則每次更新都會更新這個時間
auto_now_add 則只是第一次創(chuàng)建添加,,之后的更新不再改變。
1 2 3 4 | class UserInfo(models.Model):
name = models.CharField(max_length = 32 )
ctime = models.DateTimeField(auto_now = True )
uptime = models.DateTimeField(auto_now_add = True )
|
1 2 3 4 5 6 | 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' )
|
表結(jié)構(gòu)的修改
表結(jié)構(gòu)修改后,,原來表中已存在的數(shù)據(jù),,就會出現(xiàn)結(jié)構(gòu)混亂,makemigrations更新表的時候就會出錯
解決方法:
1,、新增加的字段,,設(shè)置允許為空。生成表的時候,,之前數(shù)據(jù)新增加的字段就會為空,。(null=True允許數(shù)據(jù)庫中為空,blank=True允許admin后臺中為空)
2,、新增加的字段,,設(shè)置一個默認(rèn)值。生成表的時候,,之前的數(shù)據(jù)新增加字段就會應(yīng)用這個默認(rèn)值
執(zhí)行makemigrations,, migrate 后。老數(shù)據(jù)會自動應(yīng)用新增加的規(guī)則
models.ImageField 圖片
models.GenericIPAddressField IP
ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True) img = models.ImageField(null=True,blank=True,upload_to="upload")
數(shù)據(jù)庫中保存的只是圖片的路徑
常用參數(shù)
選擇下拉框 choices
class UserInfo(models.Model): USER_TYPE_LIST = ( (1,'user'), (2,'admin'), ) user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)
2,、連表結(jié)構(gòu)
- 一對多:models.ForeignKey(其他表)
- 多對多:models.ManyToManyField(其他表)
- 一對一:models.OneToOneField(其他表)
應(yīng)用場景:
- 一對多:當(dāng)一張表中創(chuàng)建一行數(shù)據(jù)時,,有一個單選的下拉框(可以被重復(fù)選擇)
例如:創(chuàng)建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等,。
- 多對多:在某表中創(chuàng)建一行數(shù)據(jù)是,,有一個可以多選的下拉框
例如:創(chuàng)建用戶信息,,需要為用戶指定多個愛好
- 一對一:在某表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(下拉框中的內(nèi)容被用過一次就消失了
例如:原有含10列數(shù)據(jù)的一張表保存相關(guān)信息,,經(jīng)過一段時間之后,,10列無法滿足需求,需要為原來的表再添加5列數(shù)據(jù)
一對多:
1 2 3 4 5 6 | 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個業(yè)務(wù)
這是主機(jī)表,,可以通過外鍵,對應(yīng)到Game表的業(yè)務(wù)的ID
多對多:
1 2 3 4 5 6 7 8 | 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會自動創(chuàng)建第3張關(guān)系表,,用于對應(yīng)user id 和usergroup id
這是UserGroup表
這是User表
這是Django自動生成的對應(yīng)關(guān)系表
user_id = 1 為 yangmv,,同時屬于1,2(技術(shù)部,運(yùn)營部)
一對一: (一對多增加了不能重復(fù))
1 2 3 4 5 6 7 8 9 | 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' )
|
連接Mysql
一對多操作實例
首先生成2個表
1 2 3 4 5 6 7 8 | 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標(biāo)簽用forms生成
先執(zhí)行create_group生成3個group
已經(jīng)查詢出Group數(shù)據(jù)
添加
方法1,,方法2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def create_user(request):
obj = Forign.UserForm(request.POST)
if request.method = = 'POST' :
if obj.is_valid():
all_data = obj.clean()
#print all_data
#獲取提交頁面提交來的數(shù)據(jù){'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會自動把數(shù)據(jù)庫group2變?yōu)間roup2_id
else :
error = obj.errors
print error[ 'username' ][ 0 ]
print error[ 'usergroup' ][ 0 ]
return render(request, 'forign/create_user.html' ,{ 'obj' :obj})
|
方法3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def create_user(request):
obj = Forign.UserForm(request.POST)
if request.method = = 'POST' :
if obj.is_valid():
all_data = obj.clean()
#print all_data
#獲取提交頁面提交來的數(shù)據(jù){'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會自動把數(shù)據(jù)庫group2變?yōu)間roup2_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})
|
查詢。展示出所有的數(shù)據(jù)
1 2 3 4 5 6 7 8 9 10 11 12 | 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})
|
1 2 3 4 5 6 7 8 | < table border="1">
{% for item in user_list %}
< tr >
< td >{{ item.username }}</ td >
< td >{{ item.group2.caption }}</ td >
</ tr >
{% endfor %}
</ table >
|
GET方式查詢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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})
|
1 2 3 | #查組
get_val = request.GET.get( 'group' )
user_list = models.User2.objects. filter (group2__caption = get_val)
|
一對多跨表操作,,總結(jié)
1,、group2對應(yīng)的是一個對象
2、創(chuàng)建數(shù)據(jù) group2_id ,,直接查詢數(shù)據(jù)庫
3,、獲取數(shù)據(jù),通過. group2.caption
4,、查詢數(shù)據(jù),,通過__ group2__caption
|