1. 程式人生 > >Django Model 基礎資料庫操作應用

Django Model 基礎資料庫操作應用

https://blog.csdn.net/Mrzhangjwei/article/details/53001841

一、資料庫操作
1、建立model表


基本結構:

from django.db import models

class userinfo(models.Model):
#如果沒有models.AutoField,預設會建立一個id的自增列
name = models.CharField(max_length=30)
email = models.EmailField()
memo = models.TextField()
1
2
3
4
5
6
7
更多欄位:
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、ipv4、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檔案

更多引數:
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

2、註冊APP,settings新增app
3、生成相應的表
python manage.py makemigrations
python manage.py migrate
1
2


4、admin後臺登錄檔


python manage.py createsuperuser建立使用者

後臺可以管理,新增資料

 


二、對資料進行增刪改查
1、查
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')
1
2
3
4
5

 

 


成功獲取資料:

 

2、增
models.UserInfo.objects.create(user='yangmv',pwd='123456')
或者
obj = models.UserInfo(user='yangmv',pwd='123456')
obj.save()
1
2
3
4
或者

dic = {'user':'yangmv','pwd':'123456'}
models.UserInfo.objects.create(**dic)
1
2

 


3、刪
models.UserInfo.objects.filter(user='yangmv').delete()

 

4、改
models.UserInfo.objects.filter(user='yangmv').update(pwd='520')

或者

obj = models.UserInfo.objects.get(user='yangmv')
obj.pwd = '520'
obj.save()
1
2
3


5、常用方法
#獲取個數
#
#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 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"
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
三、常用欄位
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')
1
2
3
4
5
6
7
8
9
10


1、表結構的修改
表結構修改後,原來表中已存在的資料,就會出現結構混亂,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")
1
2

 


資料庫中儲存的只是圖片的路徑

 

2、常用引數
選擇下拉框 choices
class UserInfo(models.Model):
USER_TYPE_LIST = (
(1,'user'),
(2,'admin'),
)
user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)
1
2
3
4
5
6


3、連結串列結構
一對多: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')
1
2
3
4
5
6
這是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')
1
2
3
4
5
6
7
8
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')
1
2
3
4
5
6
7
8
9

 


連線Mysql

DATABASES ={
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'dbname',
'USER':'root',
'PASSWORD':'xxx',
'HOST':'',
'PORT':'',
}
}
1
2
3
4
5
6
7
8
9
10
一對多操作例項
首先生成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')
1
2
3
4
5
6
7
8
9


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})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

 


方法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})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


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})
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()
#方法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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


GET方式查詢

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
4
5
6
7
8
9
10
11
12
13
14


#查組
get_val = request.GET.get('group')
user_list = models.User2.objects.filter(group2__caption=get_val)
1
2
3
4


一對多跨表操作,總結
1、group2對應的是一個物件
2、建立資料 group2_id ,直接查詢資料庫
3、獲取資料,通過.     group2.caption
4、查詢資料,通過__   group2__caption
---------------------
作者:Mrzhangjwei
來源:CSDN
原文:https://blog.csdn.net/Mrzhangjwei/article/details/53001841
版權宣告:本文為博主原創文章,轉載請附上博文連結!