django資料庫操作

lm_y發表於2017-09-05

轉載地址: http://www.cnblogs.com/yangmv/p/5327477.html

一、資料庫操作

1、建立model表
       

基本結構

1
2
3
4
5
6
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、註冊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()

 
 
  1.  常用方法

      

 
 
 
二、常用欄位
models.DateTimeField  日期型別 datetime
引數,
auto_now = True :則每次更新都會更新這個時間
auto_now_add 則只是第一次建立新增,之後的更新不再改變。
 
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()
    printafter[0].ctime
    returnrender(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
class UserInfo(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列資料
     
 
一對多:
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個業務

這是主機表,可以通過外來鍵,對應到Game表的業務的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會自動建立第3張關係表,用於對應user id 和usergroup id
這是UserGroup表
這是User表
這是Django自動生成的對應關係表

user_id = 1 為 yangmv,同時屬於1,2(技術部,運營部)
 
 
 
一對一:   (一對多增加了不能重複)
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
  1.   

 
 一對多操作例項
首先生成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標籤用forms生成

先執行create_group生成3個group

 

已經查詢出Group資料


新增
方法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)
    ifrequest.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.errors
            printerror['username'][0]
            printerror['usergroup'][0]
    returnrender(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)
    ifrequest.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]
    returnrender(request,'forign/create_user.html',{'obj':obj})

  

查詢。展示出所有的資料

1
2
3
4
5
6
7
8
9
10
11
12
def create_user(request):
    obj= Forign.UserForm(request.POST)
    ifrequest.method =='POST':
        ifobj.is_valid():
            all_data= obj.clean()
            #方法3(推薦)
            models.User2.objects.create(**all_data)
            printmodels.User2.objects.all().count()
        else:
            pass
    user_list= models.User2.objects.all()
    returnrender(request,'forign/create_user.html',{'obj':obj,'user_list':user_list})
1
2
3
4
5
6
7
8
<tableborder="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)
    ifrequest.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)
    returnrender(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)

  

一對多跨表操作,總結
1、group2對應的是一個物件
2、建立資料 group2_id ,直接查詢資料庫
3、獲取資料,通過.     group2.caption
4、查詢資料,通過__   group2__caption

 

相關文章