django資料庫操作
轉載地址: 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() |
更多欄位:
更多引數
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.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 () print after[ 0 ].ctime return 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
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
一對多操作例項
首先生成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) 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
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 #獲取提交頁面提交來的資料{'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
|
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) |
一對多跨表操作,總結
1、group2對應的是一個物件
2、建立資料 group2_id ,直接查詢資料庫
3、獲取資料,通過. group2.caption
4、查詢資料,通過__ group2__caption
相關文章
- django操作多資料庫Django資料庫
- django多資料庫操作Django資料庫
- Django基礎之七(資料庫操作)Django資料庫
- Django筆記二十二之多資料庫操作Django筆記資料庫
- Django資料庫效能優化之 - 使用Python集合操作Django資料庫優化Python
- Django筆記三十七之多資料庫操作(補充版)Django筆記資料庫
- django—資料庫設定Django資料庫
- django 配置mysql資料庫DjangoMySql資料庫
- django setting 配置資料庫Django資料庫
- Django5—資料庫Django資料庫
- 資料庫操作資料庫
- 資料庫操作·資料庫
- django資料庫遷移-15Django資料庫
- Django切換MySQL資料庫DjangoMySql資料庫
- django | 連線mysql資料庫DjangoMySql資料庫
- django用什麼資料庫Django資料庫
- 【Falsk 使用資料庫】---- 資料庫基本操作資料庫
- MySQL 資料庫操作MySql資料庫
- mongodb資料庫操作MongoDB資料庫
- 資料庫基本操作資料庫
- MongoDB 資料庫操作MongoDB資料庫
- laravel 資料庫操作Laravel資料庫
- Django資料庫類庫MySQLdb使用詳解Django資料庫MySql
- 用 Django 管理現有資料庫Django資料庫
- Django 遷徙資料庫 失敗Django資料庫
- Django 2連線MySQL資料庫DjangoMySql資料庫
- 09.Django-資料庫優化Django資料庫優化
- 值得白嫖的資料庫常用操作語句彙總(資料庫、資料表、資料操作)資料庫
- Python 操作 SQLite 資料庫PythonSQLite資料庫
- 資料庫操作語句資料庫
- postgresql 資料庫基本操作SQL資料庫
- Mysql資料庫操作命令MySql資料庫
- PHP操作MySQL資料庫PHPMySql資料庫
- Python操作SQLite資料庫PythonSQLite資料庫
- python操作mongodb資料庫PythonMongoDB資料庫
- MySQL資料庫常用操作MySql資料庫
- Linux 資料庫操作(一)Linux資料庫
- Laravel 資料庫基本操作Laravel資料庫
- Go之資料庫操作Go資料庫