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

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

来到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('查找成功')

这样,就介绍完了。

总结

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

(0)

相关推荐

  • django多对多表的创建,级联删除及手动创建第三张表

    创建一张作者表,author,创建外键与book表,多对多关系 ,外键字段放在那张表都可以, class Author(models.Model): name = models.CharField(max_length=32) #在Author表中创建第三张表,与book表创建多对多关系一样的效果 # books = models.ManyToManyField(Book) #再重新生成数据库,因为新增了多对多关系,book表会新增字段,所以直接重新生成数据库就会报错, 在book表里,关联Au

  • Django的数据模型访问多对多键值的方法

    这里先来借用一个书本(book)的数据模型作为例子: from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_lengt

  • Django 标签筛选的实现代码(一对多、多对多)

    实现的目标(一对多) 实现针对课程实现:课程类型.难度级别.是否隐藏三个方式的筛选 每一个视频文件有针对一个课程类型.一个难度级别.是否隐藏 设计数据库如下: # 视频分类表格 class VideoType(models.Model): Video_Type = models.CharField(max_length=50) class Meta: verbose_name_plural = '视频分类' def __str__(self): return self.Video_Type #

  • django数据关系一对多、多对多模型、自关联的建立

    一对多模型 一对多的关系,例如员工跟部门.一个部门有多个员工.那么在django怎么建立这种表关系呢? 其实就是利用外键,在多的一方,字段指定外键即可.例如员工和部门,员工是多,所以在员工表直接部门即可. 示例(见19行): class Department(models.Model): name = models.CharField(max_length=20) create_data = models.DateField(auto_now_add=True) is_delete = mode

  • Django之多对多查询与操作方法详解

    多对多表之间关系表 models.py文件代码 from django.db import models # Create your models here. class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64,null=False,unique=True) def __str__(self): return "publisher_

  • 基于Django ORM、一对一、一对多、多对多的全面讲解

    上篇博客也提到这些知识点,可能大家还是不太清楚,这篇博客为大家详细讲解ORM中的几个知识点 1.1首先我们先看一个小案例: #_*_coding:utf-8_*_ from django.db import models # Create your models here. class Colors(models.Model): colors=models.CharField(max_length=10) #蓝色 def __str__(self): return self.colors cla

  • django ManyToManyField多对多关系的实例详解

    Django 的 ORM 有多种关系:一对一,多对一,多对多 各自定义的方式为 : 一对一: OneToOneField 多对一: ForeignKey 多对多: ManyToManyField 上边的描述太过数据而缺乏人性化,我们来更人性化一些: 多个属于一个,即 belong to : ForeignKey,多个属于一个 一个有一个,即 has one: OneToOneField 一个有很多个,即 has many: lots of A belong to B 与 B has many A

  • django多文件上传,form提交,多对多外键保存的实例

    需求: 需要实现一个用户反馈的接口,用户通过接口提交: 1.一段文字 2. 一个log文件 3. 多个图片 找了很多ModelForm,DRF-Serializer的资料,都没找到简单好用的,干脆就直接写,啥也不用. Model.py class UserFeedback(models.Model): user = models.ForeignKey(User, verbose_name="用户") desc = models.TextField(default=""

  • Django ManyToManyField 跨越中间表查询的方法

    1.在 django 表中用到了 manytomany 生成了中间表 pyclub_article_column from django.db import models # Create your models here. class Column(models.Model): id = models.AutoField(u'序号',primary_key=True,auto_created=True) name = models.CharField(u'名字',max_length=100)

  • 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

  • Django数据映射(一对一,一对多,多对多)

    目录 数据表关联关系映射 一对一映射 用法示例 一对多映射 用法示例 多对多映射 用法示例 数据表关联关系映射 常用的表关联方式有三种: 一对一映射如: 一个身份证对应一个人 一对多映射如: 一个班级可以有多个学生 多对多映射如: 一个学生可以报多个课程,一个课程可以有多个学生学习 一对一映射 一对一是表示现实事物间存在的一对一的对应关系. 如:一个家庭只有一个户主,一个男人有一个妻子,一个人有一个唯一的指纹信息等 语法 class A(model.Model): ... class B(mod

  • 在django中查询获取数据,get, filter,all(),values()操作

    django 中当我们要查询获取数据时: 数据库中的信息: 如一个学生信息表 students: get方法: students.objects().get(a = b) 其中a为students表中的一个属性如id,name 等 如:students.objects().get(name = '张三') 即获取name为张三的学生的信息 filter 用法与get相同 但是get必须只能取一个数据 filter 能去0,1,多个数据 即上述中如果表中有多个学生都叫张三同名了,get就会报错 同

  • 解决pl/sql developer中数据库插入数据乱码问题(SSM项目开发)

    最近学习SSM项目开发,用到oracle数据库,使用管理软件PL/sql developer往数据库表中插入数据时记录乱码. 结果如下: 可以看到中文数据都乱码成了???????问号, 看了网上各位大佬的解决办法,说是由于oracle服务器端字符编码 和 Oracle 客户端字符编码不一致引起的. (但是我的oracle服务器端 和 Oracle 客户端字符编码是一样的,这就很纳闷了,但同样用了以下解决办法,搞定!!!) 第一步: 登录PL/sql developer,检查Oracle服务器端字

  • Hibernate的一对一,一对多/多对一关联保存的实现

    目录 一对一关联保存: 留言表实体类配置:(主表) 留言内容表配置:(从表) 留言表hbm.xml配置:(主表) 留言内容表hbm.xml配置:(从表) 一对多/多对一保存 活动表实体类配置:(主表) 自定义报名要素实体类配置:(从表) 活动表hbm.xml配置:(主表) 报名信息表:(从表) 一对一关联保存: 说明: 留言状态表: 记录用户的留言信息,如留言人openid,留言时间等-(主表) 用户留言内容表: 记录用户的留言内容,id与状态表一对一(从表) 留言表实体类配置:(主表) 添加一

  • Mybatis 中的一对一,一对多,多对多的配置原则示例代码

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 表:market_plan(营销计划(关联了用户)) market_plan_product(产品关联营销计划) mark

  • 代码详解django中数据库设置

    首先定义数据库的表名和字段 启动mysql数据库 bash mysql.server start 安装pymysql pip install pymysql PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. 在_init_.py文件中加入如下代码: import pymysql pymysql.install_as_MySQLdb() 新建数据库 mysql -u root -p 登录root show database

  • mysql中数据库与数据表编码格式的查看、创建及修改

    一.查看数据库编码格式 mysql> show variables like 'character_set_database'; 二.查看数据表的编码格式 mysql> show create table <表名>; 三.创建数据库时指定数据库的字符集 mysql>create database <数据库名> character set utf8; 四.创建数据表时指定数据表的编码格式 create table tb_books ( name varchar(45

  • django中使用POST方法获取POST数据

    在django中获取post数据,首先要规定post发送的数据类型是什么. 1.获取POST中表单键值数据 如果要在django的POST方法中获取表单数据,则在客户端使用JavaScript发送POST数据前,定义post请求头中的请求数据类型: xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 在django的views.py相关方法中,需要通过reques

  • 浅谈Django中的数据库模型类-models.py(一对一的关系)

    如下所示: # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models # Create your models here. # 一对一关系:数据库中两个表中数据的对应关系 # 一个账户对应着一个联系人,而一个联系人有一个账户 # 一对一关系是通过在两个表之间定义相同的主键来完成 class Account(models.Model): username = models

随机推荐