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 相关文章推荐
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
Python字符串的修改方法实例
Dec 19 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
Python 没有main函数的原因
Jul 10 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
python sleep和wait对比总结
Feb 03 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 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
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Python3 socket同步通信简单示例
2017/06/07 Python
python针对excel的操作技巧
2018/03/13 Python
对python 调用类属性的方法详解
2019/07/02 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
Python logging模块handlers用法详解
2020/08/14 Python
python 5个实用的技巧
2020/09/27 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
高中班长自我鉴定
2013/12/20 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
高级工程师英文求职信
2014/03/19 职场文书
个人授权委托书
2014/04/03 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
年度考核表个人总结
2015/03/06 职场文书