Django-Model操做數據庫(增刪改查、連表結構)

Django-Model操做數據庫(增刪改查、連表結構)

1、數據庫操做

一、建立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' )
  • 鏈接Mysql
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 >
  • 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})
 
#查組
get_val = request.GET.get( 'group' )
user_list = models.User2.objects. filter (group2__caption = get_val)
  
  • 一對多跨表操做,總結

一、group2對應的是一個對象二、建立數據 group2_id ,直接查詢數據庫三、獲取數據,經過. group2.caption四、查詢數據,經過__ group2__caption

相關文章
相關標籤/搜索