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中的strftime()方法的使用
May 22 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
python图书管理系统
Apr 05 Python
获取python的list中含有重复值的index方法
Jun 27 Python
图文详解python安装Scrapy框架步骤
May 20 Python
numpy.linspace函数具体使用详解
May 27 Python
使用python爬取抖音视频列表信息
Jul 15 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
Python文本处理简单易懂方法解析
Dec 19 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
Django Path转换器自定义及正则代码实例
May 29 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 Xdebug的安装与使用详解
2013/06/20 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
用js实现放大镜效果
2020/10/28 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
windows下python连接oracle数据库
2017/06/07 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
python判断无向图环是否存在的示例
2019/11/22 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
Python collections模块的使用方法
2020/10/09 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
一套带网友答案的.NET笔试题
2016/12/06 面试题
英语道歉信范文
2014/01/09 职场文书
通信研究生自荐信
2014/02/01 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
答谢词范文
2015/01/05 职场文书
2016年元旦致辞
2015/08/01 职场文书
学校标语口号大全
2015/12/26 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android