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中Genarator函数用法分析
Apr 08 Python
Python文件读取的3种方法及路径转义
Jun 21 Python
彻底理解Python list切片原理
Oct 27 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
Java文件与类动手动脑实例详解
Nov 10 Python
Tensorflow分批量读取数据教程
Feb 07 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
pytorch显存一直变大的解决方案
Apr 08 Python
python周期任务调度工具Schedule使用详解
Nov 23 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 MemCached 高级缓存应用代码
2010/08/05 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
js判断是否是手机页面
2017/03/17 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
python测试驱动开发实例
2014/10/08 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
Python中常用的内置方法
2019/01/28 Python
Python中print和return的作用及区别解析
2019/05/05 Python
使用Python发现隐藏的wifi
2020/03/04 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
幼儿园五一活动方案
2014/02/07 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
《穷人》教学反思
2014/04/08 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
体育运动会广播稿
2014/10/05 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL