DjangoORM外鍵操作


Django ORM 外鍵操作

經常修改的東西一般不放到內存里面,而是放到一張表里。表跟表之間是可以存在關系的,最基本的就是一對多的關系。

models.ForeignKey(ColorDic)

1. 在models.py中創建2張表,UserGroup中有2列數據,UserInfo中有3列數據。

from django.db import models
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=32,unique=True)


class UserInfo(models.Model):
    username=models.CharField(max_length=32,blank=True,verbose_name='用戶名')
    password = models.CharField(max_length=64,help_text='pwd')

 需要運行python manage.py makemigrations/python manage.py migrate 這兩句才能生效。

2. 在表中創建數據備用

 

創建好的數據如下:

 

3. 創建外鍵關聯 user_group=models.ForeignKey('UserGroup',to_field='uid',default=1)

外鍵關聯,因為是外鍵關聯,所以它里面存的數據是上表中的uid值。

to_field='uid',代表要跟那張表里面的uid進行關聯。這個字段不加也可以,那么默認用的就是主鍵。

 

 

 

 

一定一定要記住,這里有1個特殊的現象,雖然我們創建的列名是user_group字段 (外鍵關聯了UserGroup中的uid字段)。但是django會自動給我們增加了1個id字段。 在數據庫中的實際列名為user_group_id 。

user_group代指的是UserGroup對象,對象里面封裝了好多值(uid,caption)。

 

我們想的是這樣的: 

 

 

 

 

 

實際上在數據庫中是這樣的:

 

4. 怎么樣通過外鍵去獲取到用戶屬於哪個組呢?這塊很重要 


for row in user_list:
  #print(row.user_group_id) #代表數據庫中真實存在的那個數據   
  #print(row.user_group) #user_group是通過外鍵關聯生成的,代指的是UserGroup類及里面的所有對象,里面封裝了(uid,caption)
  #print(row.user_group.uid)  #獲取UserGroup中的uid值

  #print(row.user_group.caption)  #獲取UserGroup中的caption值

 

 比如我們想要在user_info頁面顯示用戶名以及用戶屬於哪個組

 

 在user_info函數里面做個測試,看應該怎么取值。

def user_info(request):     
  if request.method=='GET':
    user_list=models.UserInfo.objects.all()
#print(user_list.query)
# QuerySet[obj(id,username,password,user_group_id,user_group(uid,caption)]
# user_info里面封裝了(id,username,password,user_group_id,user_group)這5個字段,其中user_group代表的是UserGroup類,
它里面還封裝了(uid,caption)這2個字段。
#for row in user_list:
# print(row.id)
# print(row.user_group.caption)

 

 打印一下user_group,證明確實是個對象

 

 5. 修改user_info.html模板,得到想要的效果。  

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="height:48px;background-color:black;color:white">
        歡迎登陸教育系統
    </div>
    <div>
        <div style="position:absolute;top:48px;bottom:0;left:0;width:200px;background-color:brown;">
            <a class="menu" href="/user_info/">用戶管理</a>
            <a class="menu" href="/user_group/">用戶組管理</a>
        </div>

        <div style="position:absolute;top:48px;left:210px;bottom:0;right:0;overflow:auto">

            <h1>添加用戶</h1>
            <form method="POST" action="/user_info/">
                <input type="text" name="user"/>
                <input type="text" name="pwd"/>
                <input type="submit" value="添加"/>
            </form>

            <h1>用戶列表</h1>
            <ul>
                {% for row in user_list%}
                    <li>
                        <a href="/userdetail-{{row.id}}">{{row.username}}</a> |
                        <span>{{row.user_group.caption}}</span>
                        <a href="/userdel-{{row.id}}/">刪除</a> |
                        <a href="/useredit-{{row.id}}/">編輯</a>
                    </li>
                {% endfor %}
            </ul>


        </div>
    </div>
</body>
</html>

 效果:

 

至此就實現了通過跨表去獲取數據了。

6. 接下來看怎么樣在有外鍵的情況下去新建一條數據。

新建數據還是在orm中實現

 

在表中查看,已經新增了1條記錄。

 

其實創建數據的時候,有以下2種方式,上面采用的是推薦的第二種方式。第一種方式需要再查一次表,不推薦使用。

 

7. 在頁面上增加用戶的時候,提供一個下拉框,可以選擇用戶處於哪個組。

 

8. 如果像這樣,在user_info頁面把用戶組的可選項都寫死的話,如果數據庫中又增加了一個選項的話,那么這個選項是沒法出現在user_info頁面的,所以我們應該把group_list的可選項寫成是動態的。

在view.py中的user_info中增加程序獲取group_list的信息

 

在user_info.html中動態循環獲得數據

效果圖

 

測試,在數據庫中手動增加1條記錄

 

在瀏覽器中已經有這個可選項了。這樣就實現了動態的同步。

 

與本節內容有關的程序粘貼一部分:

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^orm/', views.orm),
    url(r'^index/', views.index),
    url(r'^user_info/', views.user_info),
    url(r'^user_group/', views.user_group),
    url(r'^userdetail-(?P<nid>\d+)/', views.user_detail),
    url(r'^userdel-(?P<nid>\d+)/', views.user_del),
    url(r'^useredit-(?P<nid>\d+)/', views.user_edit),
    url(r'^detail-(?P<nid>\d+).html', views.detail),

]

 views.py

from django.shortcuts import render,HttpResponse,redirect
import os

from app01 import models
def orm(request):
    #更新
    #models.UserInfo.objects.filter(id=2).update(user_group=2)

    #新建
    #models.UserInfo.objects.create(id=3).update(user_group=2)
    #models.UserInfo.objects.create(username='root',password=123)
    #models.UserInfo.objects.create(username='Jack', password=433)
    #models.UserInfo.objects.create(username='Alex', password=999)
    #models.UserGroup.objects.create(caption='VIP')
    #models.UserGroup.objects.create(caption='Normal')

    #刪除
    #models.UserGroup.objects.filter(id=2).delete()

    #查詢
    result=models.UserInfo.objects.all()
    #print(result)

    for row in result:
        print(row.id,row.username,row.password)
    print(result)

    #在有外鍵的情況下,新建一條數據。
    models.UserInfo.objects.create(
        username='root1',
        password='123',
        user_group_id=2,
    )
    return HttpResponse('orm')

USER_LIST={
    '1':{'name':'root1','email':'root1@126.com'},
    '2':{'name':'root2','email':'root2@126.com'},
    '3':{'name':'root3','email':'root3@126.com'},
}

def index(request):
    models.UserInfo.objects.create(caption='DBA')
    return render(request,'index.html')

def user_info(request):
    if request.method=='GET':
        user_list=models.UserInfo.objects.all()
        group_list=models.UserGroup.objects.all()
        #print(group_list)
            #print(user_list.query)
            # QuerySet[obj(id,username,password,user_group_id,user_group(uid,caption)]
        #for row in user_list:
             #print(row.id)
             #print(row.user_group)
             #print(row.user_group.uid)
             #print(row.user_group.caption)
        return render(request,'user_info.html',{'user_list':user_list,'group_list':group_list})

    elif request.method=='POST':
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        print(u,p)
        models.UserInfo.objects.create(username=u,password=p)
        return redirect('/user_info/')

def user_group(request):
    return render(request,'user_group.html')

def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})

def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/user_info/')

def user_edit(request,nid):
    if request.method=='GET':
        obj=models.UserInfo.objects.filter(id=nid).first()
        return render(request,'user_edit.html',{'obj':obj})
    elif request.method=='POST':
        nid=request.POST.get('id')
        u=request.POST.get('username')
        p = request.POST.get('password')
        models.UserInfo.objects.filter(id=nid).update(username=u,password=p)
        return redirect('/user_info/')

def detail(request,nid):
    detail_info=USER_LIST[nid]
    return render(request,'detail.html',{'detail_info':detail_info})


#Create your views here.

def login(request):
    print(request.method)
    if request.method=='GET':
        return render(request, 'login.html')
    elif request.method=='POST':
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        obj=models.UserInfo.objects.filter(username=u,password=p).first()
        if obj:
            return redirect('/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')

 models.py

from django.db import models
# Create your models here.
class UserGroup(models.Model):
     uid=models.AutoField(primary_key=True) #表示uid是自增列,它必須同時還是主鍵。表里面只能有1個自增列,所以總共只有2列了。uid+caption列
     caption=models.CharField(max_length=32,unique=True)
#運行后,django會生成一張名字為app01_userinfo的表。
class UserInfo(models.Model):
     username=models.CharField(max_length=32)
     password = models.CharField(max_length=32)
     user_group=models.ForeignKey('UserGroup',to_field='uid',default=1)
     #外鍵關聯,因為是外鍵關聯,所以它里面存的數據是上表中的uid值。
     #to_field='uid',代表要跟那張表里面的uid進行關聯。這個字段不加也可以,那么默認用的就是主鍵。
     # 雖然我們創建的列名是user_group字段,但是django會自動給我們增加1個id字段。 在數據庫中的實際列名為user_group_id
     # user_group代指的是UserGroup對象,對象里面封裝了好多值(uid,caption)。

user_list=UserInfo.objects.all()
for row in user_list:
     print(row.user_group_id) #代表數據庫中真實存在的那個數據
     #print(row.user_group) #user_group是通過外鍵關聯生成的,代指的是UserGroup類及里面的所有對象,里面封裝了(uid,caption)
     #print(row.user_group.caption)

 user_info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="height:48px;background-color:black;color:white">
        歡迎登陸教育系統
    </div>
    <div>
        <div style="position:absolute;top:48px;bottom:0;left:0;width:200px;background-color:brown;">
            <a class="menu" href="/user_info/">用戶管理</a>
            <a class="menu" href="/user_group/">用戶組管理</a>
        </div>

        <div style="position:absolute;top:48px;left:210px;bottom:0;right:0;overflow:auto">

            <h1>添加用戶</h1>
            <form method="POST" action="/user_info/">
                <input type="text" name="user"/>
                <input type="text" name="pwd"/>
                <select name="group_id">
                    {% for item in group_list %}
                        <option value="{{item.uid}}">{{item.caption}}</option>
                    {% endfor %}
                </select>
                <input type="submit" value="添加"/>
            </form>

            <h1>用戶列表</h1>
            <ul>
                {% for row in user_list%}
                    <li>
                        <a href="/userdetail-{{row.id}}">{{row.username}}</a> |
                        <span>{{row.user_group.caption}}</span>
                        <a href="/userdel-{{row.id}}/">刪除</a> |
                        <a href="/useredit-{{row.id}}/">編輯</a>
                    </li>
                {% endfor %}
            </ul>


        </div>
    </div>
</body>
</html>

 user.group.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="height:48px;background-color:black;color:white">
        歡迎登陸教育系統
    </div>
    <div>
        <div style="position:absolute;top:48px;bottom:0;left:0;width:200px;background-color:brown;">
            <a class="menu" href="/user_info/">用戶管理</a>
            <a class="menu" href="/user_group/">用戶組管理</a>
        </div>

        <div style="position:absolute;top:48px;left:210px;bottom:0;right:0;overflow:auto">
            <h1>用戶組管理</h1>


        </div>
    </div>
</body>
</html>

 user.detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="height:48px;background-color:black;color:white">
        歡迎登陸教育系統
    </div>
    <div>
        <div style="position:absolute;top:48px;bottom:0;left:0;width:200px;background-color:brown;">
            <a class="menu" href="/user_info/">用戶管理</a>
            <a class="menu" href="/user_group/">用戶組管理</a>
        </div>

        <div style="position:absolute;top:48px;left:210px;bottom:0;right:0;overflow:auto">
            <h1>用戶詳細信息</h1>
            <h3>{{obj.id}}</h3>
            <h3>{{obj.username}}</h3>
            <h3>{{obj.password}}</h3>
        </div>
    </div>
</body>
</html>

 user_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="height:48px;background-color:black;color:white">
        歡迎登陸教育系統
    </div>
    <div>
        <div style="position:absolute;top:48px;bottom:0;left:0;width:200px;background-color:brown;">
            <a class="menu" href="/user_info/">用戶管理</a>
            <a class="menu" href="/user_group/">用戶組管理</a>
        </div>

        <div style="position:absolute;top:48px;left:210px;bottom:0;right:0;overflow:auto">
            <h1>編輯用戶</h1>
            <form method="POST" action="/useredit-{{obj.id}}/">
                <input style='display:none' type="text" name="id" value="{{obj.id}}"/>
                <input type="text" name="username" value="{{obj.username}}"/>
                <input type="text" name="password" value="{{obj.password}}"/>
                <input type="submit" value="提交"/>
            </form>
        </div>
    </div>
</body>
</html>

 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="height:48px;background-color:black;color:white">
        歡迎登陸教育系統
    </div>
    <div>
        <div style="position:absolute;top:48px;bottom:0;left:0;width:200px;background-color:brown;">
            <a class="menu" href="/user_info/">用戶管理</a>
            <a class="menu" href="/user_group/">用戶組管理</a>
        </div>

        <div style="position:absolute;top:48px;left:210px;bottom:0;right:0;overflow:auto">
            <h1>編輯用戶</h1>
            <form method="post" action="/useredit-{{obj.id}}/">
                <input style="display:none" type="text" name="id" value="{{obj.id}}"/>
                <input type="text" name="username" value="{{obj.username}}"/>
                <input type="text" name="password" value="{{obj.password}}"/>
                <input type="submit" value="提交"/>
            </form>

        </div>
    </div>
</body>
</html>

 目錄

 

 

本節筆記:

	一對多
		A-外鍵
		B-外鍵字段_id
		C-
			models.tb.object.create(name='root',user_group_id=1)
		D-
			userlist=models.tb.object.all()
			for row in userlist:
				row.id
				row.user_group_id
				row.user_group.caption

 

參考出處:http://blog.csdn.net/fgf00/article/details/53678205 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM