国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django中數據庫的數據關系:一對一,一對多,多對多

2020-01-04 14:17:10
字體:
來源:轉載
供稿:網友

一對一:

一對一的關系極為一個數據僅對應一個數據,用下圖的結構圖可以幫助理解:

Django,數據庫,數據關系,一對一,一對多,多對多

下面用代碼實現一下,首先要創建工程項目如下:

Django,數據庫,數據關系,一對一,一對多,多對多

接著,我們定義模型:

來到models.py文件,創建兩個模型:

from django.db import models# Create your models here.class One(models.Model):  oname = models.CharField(max_length=20,null=True)  oage = models.CharField(max_length=20,null=True)  odate = models.DateField(null=True)class Two(models.Model):# 設置一對一關系,是通過將表中的字段設置為主鍵完成的# on_delete=models.CASCADE 當父表中的某一條數據刪除的時候  # 相關字表中的數據也會被刪除  tsub = models.OneToOneField(One,on_delete=models.CASCADE,primary_key=True)  tfond = models.CharField(max_length=20,null=True)  tdes = models.CharField(max_length=200,null=True)

來到myPro文件夾下添加以下兩句代碼:

import pymysqlpymysql.install_as_MySQLdb()

下面可以遷移文件:

python manage.py makemigrationspython manage.py migrate

這樣我們就創建了兩個表:

Django,數據庫,數據關系,一對一,一對多,多對多

來到views.py文件中添加數據,代碼如下:

from django.shortcuts import renderfrom .models import One,Two# Create your views here.def index(request):  o1 = One.objects.create(oname='張三',oage=11,odate='2011-11-11')  o2 = One.objects.create(oname='張三2',oage=12,odate='2012-12-12')  t1 = Two.objects.create(tsub=o1,tfond='o1',tdes='我喜歡o1')  t2 = Two.objects.create(tsub=o2,tfond='o2',tdes='我喜歡o2')  return render(request,'index.html')

運行之后,將添加數據的代碼注釋掉,否則后面每運行一次都會添加。

下面,我們通過查詢數據來甄別其中的關系。

def select(request):  t1 = Two.objects.get(tsub__oname = '張三')  return render(request,'index.html',{'t1':t1})

一對多

即一個對象對應著對個對象。

創建模型代碼:

from django.db import models# Create your models here.class People(models.Model):  name = models.CharField(max_length=50)  card_num = models.IntegerField(default=0)class Card(models.Model):  number = models.CharField(max_length=20)  person = models.ForeignKey(People,on_delete=models.CASCADE)  source = models.CharField(max_length=50)

urls.py路由設置:

from django.contrib import adminfrom django.urls import pathfrom myApp import viewsurlpatterns = [  path('admin/', admin.site.urls),  path('add/',views.add),  path('select/',views.select),]

views.py文件中代碼:

from django.shortcuts import renderfrom .models import People,Cardfrom django.http import HttpResponse# Create your views here.# 添加數據def add(request):  # p1 = People.objects.create(name='小王',card_num = 4)  # p2 = People.objects.create(name='老王', card_num=40)  #  # c1 = Card(number='101',source = '中國銀行',person = p1)  # c2 = Card(number='102', source='中國農行', person=p1)  # c3 = Card(number='110', source='中國建行', person=p1)  # c1.save()  # c2.save()  # c3.save()  #  # c4 = Card(number='201', source='河南鄭州美容美發', person=p2)  # c5 = Card(number='202', source='鄭州交通一卡通', person=p2)  # c6 = Card(number='203', source='鄭州逍遙鎮胡辣湯', person=p2)  # c7 = Card(number='204', source='鄭州惠濟四附院', person=p2)  #  # c4.save()  # c5.save()  # c6.save()  # c7.save()  return HttpResponse('添加成功')def select(request):  # 查找number=203的人  c1 = Card.objects.get(number='203')  print(c1.person.name)  # 查找id為3對應的人  c2 = Card.objects.get(id=3)  print(c2.person.name)  # 查找c2的所有卡  result = c2.person.card_set.all()  print(result)  for res in result:    print(res.source)  # 查找名字為老王的所有卡種  result = People.objects.get(name='老王')  for card in result.card_set.all():    print(card.source)  return HttpResponse('查詢成功')

多對多

即多個對象對應對個對象,類似公交車坐車,人可以坐多個公交車,公交車也可以載不同的人。

創建模型代碼如下:

from django.db import models# Create your models here.class Publication(models.Model):  pname = models.CharField(max_length=200)  paddress = models.CharField(max_length=200)class Book(models.Model):  bname = models.CharField(max_length=200)  bauthor = models.CharField(max_length=200)  publication = models.ManyToManyField(Publication)

視圖文件views.py文件代碼如下:

from django.shortcuts import renderfrom .models import Publication,Bookfrom django.http import HttpResponse# Create your views here.def add(request):  # p1 = Publication(pname='大象出版社',paddress='河南',)  # p2 = Publication(pname='北京出版社',paddress='北京')  # p3 = Publication(pname='清華出版社',paddress='河北')  # p1.save()  # p2.save()  # p3.save()  #  # b1 = Book(bname='海底兩萬里',bauthor='趙四')  # b2 = Book(bname='遮天',bauthor='辰東')  # b3 = Book(bname='童年', bauthor='xxxx')  # b4 = Book(bname='在人間', bauthor='yyyy')  # b5 = Book(bname='我的大學', bauthor='張飛')  # b6 = Book(bname='湯姆索亞歷險記', bauthor='趙六兒')  # b1.save()  # b2.save()  # b3.save()  # b4.save()  # b5.save()  # b6.save()  #  # b1.publication.add(p1,p2,p3)  # b2.publication.add(p1,p2)  # b3.publication.add(p1,p3)  # b4.publication.add(p2,p3)  # b5.publication.add(p3)  # 多對多關系,兩個表不直接產生聯系,而是將兩個表之間的關系記錄在中間表上  # 中間表不需要創建,會自動生成  return HttpResponse('添加成功')def select(request):  # 通過書籍查找對應的出版社  b1 = Book.objects.get(bname='童年')  # 獲取出版童年的所有出版社  b1_publication = b1.publication.all()  for pub in b1_publication:    print(pub.pname)    print(pub.paddress)  p1 = Publication.objects.get(pname = '清華出版社')  all_book = p1.book_set.all()  print('------------------')  for book in all_book:    print(book.bname)    print(book.bauthor)  return HttpResponse('查找成功')

這樣,就介紹完了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大名县| 万州区| 文安县| 台江县| 永春县| 安西县| 陈巴尔虎旗| 淅川县| 灵寿县| 内江市| 霞浦县| 辰溪县| 定襄县| 清新县| 乌什县| 井陉县| 太仆寺旗| 招远市| 沁源县| 松江区| 古丈县| 景东| 赤城县| 万安县| 长治市| 康定县| 五大连池市| 麻栗坡县| 镇沅| 祥云县| 陵水| 麟游县| 钟山县| 青州市| 左云县| 商洛市| 宁武县| 临江市| 长泰县| 漠河县| 天镇县|