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版的文曲星猜数字游戏代码
Sep 02 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
python tkinter基本属性详解
Sep 16 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
Python序列类型的打包和解包实例
Dec 21 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 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获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
vue eslint简要配置教程详解
2019/07/26 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
Python 文件管理实例详解
2015/11/10 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python入门之后再看点什么好?
2018/03/05 Python
python中的tcp示例详解
2018/12/09 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
什么是聚集索引和非聚集索引
2012/01/17 面试题
优秀少先队辅导员事迹材料
2014/12/24 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
校长新学期致辞
2015/07/30 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
Go各时间字符串使用解析
2021/04/02 Golang