Django中数据库的数据关系:一对一,一对多,多对多


Posted in Python onOctober 21, 2018

一对一:

一对一的关系极为一个数据仅对应一个数据,用下图的结构图可以帮助理解:

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 pymysql
pymysql.install_as_MySQLdb()

下面可以迁移文件:

python manage.py makemigrations
python manage.py migrate

这样我们就创建了两个表:

Django中数据库的数据关系:一对一,一对多,多对多

来到views.py文件中添加数据,代码如下:

from django.shortcuts import render
from .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 admin
from django.urls import path
from myApp import views
urlpatterns = [
  path('admin/', admin.site.urls),
  path('add/',views.add),
  path('select/',views.select),
]

views.py文件中代码:

from django.shortcuts import render
from .models import People,Card
from 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 render
from .models import Publication,Book
from 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('查找成功')

这样,就介绍完了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python 图片验证码代码分享
Jul 04 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
python同时遍历两个list用法说明
May 02 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
Django REST framework 限流功能的使用
Jun 24 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 #Python
Python根据文件名批量转移图片的方法
Oct 21 #Python
浅谈Python中的bs4基础
Oct 21 #Python
python清除字符串前后空格函数的方法
Oct 21 #Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 #Python
Scrapy框架使用的基本知识
Oct 21 #Python
python去掉 unicode 字符串前面的u方法
Oct 21 #Python
You might like
php 什么是PEAR?
2009/03/19 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
python操作日期和时间的方法
2014/03/11 Python
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python中argparse模块用法实例详解
2015/06/03 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
数据库连接池的工作原理
2012/09/26 面试题
送餐员岗位职责范本
2014/02/21 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
客户答谢会活动方案
2014/08/31 职场文书
会议欢迎词范文
2015/01/27 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
python如何利用cv2模块读取显示保存图片
2021/06/04 Python