Django基礎-Model數據庫多表操做(一對多)

建立多表外鍵關聯

models.pyhtml

from 應用名 import models

class 表1(models.Model):                                        #子表
    id=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')    #建立主鍵,自增加、設置主鍵、無序列號設置、詳細名稱爲ID
    字段1=models.CharField(max_length=20)                       #建立字符串字段,最大長度爲20
    字段2=models.IntegerField()                                 #建立整型字段
    字段3=models.ForeignKey("表2",on_delete=models.CASCADE,)    #建立外鍵 【整型字段】,自動關聯另一張表主鍵,並設置級聯刪除
class 表2(models.Model):                                        #主表
    id=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')    #建立主鍵,自增加、設置主鍵、無序列號設置、詳細名稱爲ID
    字段1=models.CharField(max_length=20)                       #建立字符串字段,最大長度爲20

注:外鍵關聯後,外鍵關聯字段3名稱在數據庫中自動添加後綴_id,即變爲 【字段3_id】python

setting.pymysql

INSTALLED_APPS = [應用名]

建立生成表sql

python manage.py makemigrations 應用名
python manage.py migrate

表數據操做

增長

在views.py中添加視圖函數,要提早引用視圖models類數據庫

from 應用名.models import 類名                      #引入視圖數據庫models類

方法一:主表id形式賦值添加django

注:須要在字段3,即外鍵字段中後加_id,和數據庫保持一致函數

def 函數名(request):
    表類名.objects.create(字段1="值1", 字段2="值2", 字段3_id=表2的id)
    return 返回值

方法二:主表查找字段值添加網站

def 函數名(request):
    數據對象=表類名.objects.filter(搜索的字段="搜索的值")[0]              #根據字段搜索值,拿到值對象
    表類名.objects.create(字段1="值1", 字段2="值2", 字段3=值對象)         #對象賦值並不是直接操做數據庫
    return 返回值

查詢

正向查詢

查詢主表特定值,包含的全部子表值url

方法一:獲取主表對象當作子表查詢條件code

def 查詢函數名(request):                                                      #查詢數據函數
    Env_Obj = 主表.objects.filter(Name="森林")[0]                            #得到主表符合條件對象
    set=子表.objects.filter(外鍵字段名=Env_Obj).values("匹配字段1","匹配字段2")           #在子表中搜索(主表得到對象做爲條件)查詢
    return HttpResponse(set)

方法二:獲取主表匹配項外鍵id,套用在子表中查詢

def 查詢函數名(request):                                                      #查詢數據函數
    set=子表.objects.filter(外鍵字段名__匹配字段名="字段值").values("匹配字段1","匹配字段2")        #使用雙下劃線,在子表中搜索(主表特定值的id)
    return HttpResponse(set)

反向查詢

使用values雙下劃線,在子表中搜索特定值,取特定id顯示主表該id對應值

def 查詢函數名(request):                                                         #反向查詢-查詢數據函數
    set = 子表.objects.filter(字段名="值").values("Link__匹配字段名")              #使用values雙下劃線,在子表中搜索特定值,取特定id顯示主表該id對應值
    return HttpResponse(set)

一對多查詢示例

models.py

# -*- coding:utf8 -*-
from django.db import models


##########################################    建立表    #########################################

class Env_Table(models.Model):                                                  #主表-環境表
    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')  # 建立主鍵,自增加、設置主鍵、無序列號設置、詳細名稱爲ID
    Name = models.CharField(max_length=20)                                                          #建立字符串字段,最大長度爲20


class Animal_Table(models.Model):                                               #子表-動物表
    id=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')    #建立主鍵,自增加、設置主鍵、無序列號設置、詳細名稱爲ID
    Type=models.CharField(max_length=20)                                                            #建立字符串字段,最大長度爲20
    Name=models.CharField(max_length=20)                                                            #建立字符串字段,最大長度爲20
    Link=models.ForeignKey("Env_Table",on_delete=models.CASCADE,)                                   #建立外鍵 【整型字段】,自動關聯另一張表主鍵,並設置級聯刪除
    #外鍵建立表在數據庫默認 Django 會加後綴_id  表名稱變動爲 Link_id

views.py

# -*- coding:utf8 -*-
from django.shortcuts import render,HttpResponse
import datetime
from APP.models import Animal_Table
from APP.models import Env_Table

def Index(request):                                                         #網站默認首頁
    return render(request,"index.html",locals())

def Add_Env(request):                                                               # 添加主表函數
    Env_Table.objects.create(Name="森林")
    Env_Table.objects.create(Name="海里")
    return HttpResponse("添加成功")

def Add_Animal(request):                                                              #添加子表函數

    # 表中添加數據,外鍵鏈接字段須要在後綴添加 _id ,以數據庫顯示字段名爲準
    Animal_Table.objects.create(Type="食肉動物", Name="老虎", Link_id="1")
    Animal_Table.objects.create(Type="食草動物", Name="兔子", Link_id="1")
    Animal_Table.objects.create(Type="食草動物", Name="烏龜", Link_id="2")
    Animal_Table.objects.create(Type="食肉動物", Name="鱷魚", Link_id="2")
    return HttpResponse("添加成功")


#方法一:獲取主表對象當作子表查詢條件-基於對象
# def Sel_data_z(request):                                                        #查詢數據函數
#     Env_Obj = Env_Table.objects.filter(Name="森林")[0]                            #得到主表符合條件對象
#     set=Animal_Table.objects.filter(Link=Env_Obj).values("Type","Name")           #在子表中搜索(主表得到對象做爲條件)查詢
#     return HttpResponse(set)
#方法二:基於filte values 雙下劃線
def Sel_data_z(request):                                                        #正向查詢-查詢數據函數
    #查詢全部在「森林」裏的動物
    set=Animal_Table.objects.filter(Link__Name="森林").values("Type","Name")        #使用雙下劃線,在子表中搜索主表特定值的id,顯示子表該id的對應值
    return HttpResponse(set)
def Sel_data_f(request):                                                         #反向查詢-查詢數據函數
    # 查詢動物在哪一個環境
    set = Animal_Table.objects.filter(Name="兔子").values("Link__Name")              #使用values雙下劃線,在子表中搜索特定值,取特定id顯示主表該id對應值
    return HttpResponse(set)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <a href="/add_Anl/">一對多添加動物</a>
    <a href="/add_Env/">添加環境</a>
    <a href="/select_z/">正向查詢數據</a>
    <a href="/select_f/">反向查詢數據</a>

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

urls.py

# coding=utf8
from django.contrib import admin
from django.urls import path,re_path
from APP import views


urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^$',views.Index),
    path('add_Env/', views.Add_Env),                # 添加主表
    path('add_Anl/', views.Add_Animal),             # 添加子表
    path('select_z/', views.Sel_data_z),            # 正向查詢
    path('select_f/', views.Sel_data_f),            # 反向查詢
]

__init__.py

import pymysql

pymysql.install_as_MySQLdb()

settings.py

INSTALLED_APPS

'APP',

TEMPLATES

'DIRS': [os.path.join(BASE_DIR, 'APP/templates')],

DATABASES

{
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydata',
        'USER': 'mydata',
        'PASSWORD': 'Abc123',
        'HOST': '192.168.88.80',
        'POST': '3306',
    }
}
相關文章
相關標籤/搜索