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)
# -*- 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
# -*- 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)
<!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), # 反向查詢 ]
import pymysql pymysql.install_as_MySQLdb()
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', } }