一对一、一对多、多对多模型关系的建立和增删改查要注意的问题

一对一:

1.在维护关系的一方使用:models.OneToOneField(另一个一方模型类名称,on_delete=models.CASCADE)

eg:

from django.db import modelsclass Wife(models.Model):name = models.CharField(max_length=10)age = models.IntegerField()#重写def __str__(self):return self.name#表的重命名class Meta:db_table = 'a_wife'class Husband(models.Model):name = models.CharField(max_length=10)age = models.IntegerField()#一对一关联o2o = models.OneToOneField(Wife,on_delete=models.CASCADE)def __str__(self):return self.nameclass Meta:db_table = 'a_husband'

2.非维护关系的一方模型对象创建:

1)变量名 = 非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).create(字段名=值,...)

2)非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).create(字段名=值,...)

3)变量名 = 非维护关系的一方对象模型名(字段名=值,...)

变量名.save()进行保存

维护关系一方的模型的创建:

1)通过非维护关系一方的实例化对象关联

变量名 = 维护关系一方模型对象名.对象管理器(非自定义默认为objects).create(字段名=值,...关联变量名=非维护关系一方实例变量名)

2)通过对应表的外键关联

变量名 = 维护关系一方模型对象名.对象管理器(非自定义默认为objects).create(字段名=值,...关联变量名_非维护关系一方主键字段名=非维护关系一方主键字段值)

eg:

# 1)
w1=Wife.objects.create(name='小妖',age=25);
# 2)
Wife.objects.create(name='小妖',age=25);
# 3)
w3=Wife(name='小妖',age=25);
w3.save()

3.非维护关系的一方模型对象的删除:

变量名 = 非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).git(字段名=值,...)

变量名.delete()

eg:

#在不维护关系的一方进行删除时:因为在维护关系的一方与其进行了关联,即在维护关系的一方有其数据的存在,所以不维护关系一方的数据删除后,维护关系的一方的与其有关联的数据也会一并删除
#在维护关系的一方进行删除时,则不会影响不维护关系一方的表的数据
d2=Wife.objects.get(id=2);d2.delete();

4.非维护关系的一方模型对象的修改:

先进行查找:变量名 = 非维护关系的一方对象模型名.对象管理器(非自定义默认为objects).git(字段名=值,...)

变量名.字段名 = 修改后的值

变量名.save()

eg:

h=Husband.objects.get(id=2);h.name='颙颜';h.save()

5.其实查找问题一直贯穿其它几个操作之中。

一对多:

1.模型建立需要注意:多方模型内创建外键类属性,关联一方:

变量名 = models.ForeignKey(一方模型类名称,on_delete=models.CASCADE)

2.模型创建:

一方:参考一对一中的创建

多方:

1)通过“一”方的实例化对象关联

2)通过对应表的外键关联

3)通过“一”方添加对象:变量名 = 一方实例化对象.多方对象模型名_set.create(字段名=值,...)

3.查询:

从一方查询多方:使用“多”方模型类小写_set,作为“一”方容器。

从“多”方查询“一”方: 使用“多”方外键属性直接获取对应的“一”方实例

4.删除、修改就是基本的操作

多对多:

1.多方创建模型关系

models.ManyToManyField(另一个多方模型类,through="中间关系模型类")

eg:

#在中间模型类中至少有两个外键类属性,分别关联两个多方模型。class Student(models.Model):passclass Course(models.Model):name = models.CharField(max_length=10)stu = models.ManyToManyField(Student,through="Student_Course") # 多对多关系class Student_Course(models.Model):   # 中间模型,负责维护两个“多方”模型student = models.ForeignKey(Student,on_delete=models.CASCADE)  # 关联Student模型的外键course = models.ForeignKey(Course,on_delete=models.CASCADE) # 关联Course模型的外键score = models.FloatField()

2.维护关系的和不负责维护关系的创建都是通过基本的创建方式实现

第三方关系表的创建则可以用实例化对象关联和外键值关联

    #使用实例化对象关联sc1 = Student_Course.objects.create(student=stu1,course=course1,score=85)#使用外键值关联sc3 = Student_Course.objects.create(student_id=3,course_id=1,score=69)

3.查询:

从不负责的多方查询另一个多方

    #例如:1号学生选的课程student1 = Student.objects.get(id=1)courses = student1.course_set.all()  # 对方模型类小写_set

从负责关联的多方查询另一个多方

    #例如:查询选择2号课程的学生course2 = Course.objects.get(id=2)students = course2.stu.all()  # stu为关联类属性

4.修改和删除就是基本的操作

一对一、一对多、多对多模型关系的建立和增删改查要注意的问题相关推荐

  1. Django 07模型层—单表操作(增删改查)

    单表查询 一.数据库相关设置 ''' # Mysql连接配置 DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': ...

  2. 004--Django(定义模型类、数据的增删改查、F和Q对象)

    1.创建数据库 mysql -uroot -pmysqlcreate database django_demo charset=utf8; 2.配置mysql数据库 在settings.py 中配置数 ...

  3. MySQL基础(三)表关系及数据的增删改查

    这一部分主要使用SQL中的DML,数据库操作语言(data manipulation language),对数据库数据进行增.删.改.查操作,作为前提,先介绍关系型数据库中的表关系. 关系型数据库(R ...

  4. 通过用户模型,对数据库进行增删改查操作

    增加:user = db.session.add(user)db.session.commit() #增加 user = User(username ='JACKSON',password='0328 ...

  5. 二十四、通过用户模型,对数据库进行增删改查操作

    增加:user = db.session.add(user)db.session.commit() 查询:User.query.filter(User.username == 'mis1114').f ...

  6. 模仿滴滴打车的数据库设计、实体类映射关系配置、语句增删改查(2)

    1.编写dao类 package com.dao;import java.util.List;import org.hibernate.Query; import org.hibernate.Sess ...

  7. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.

    1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单 ...

  8. SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现

    场景 业务中经常会用到一对多的数据库的设计与数据的增删改查的实现. 比如要实现一个对手机应用配置允许访问的权限的业务. app与权限就是一对多的关系.即一个app可以拥有多个权限. 注: 博客: ht ...

  9. mysql一对多增删改查_SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现...

    场景 业务中经常会用到一对多的数据库的设计与数据的增删改查的实现. 比如要实现一个对手机应用配置允许访问的权限的业务. app与权限就是一对多的关系.即一个app可以拥有多个权限. 注: 实现 首先设 ...

最新文章

  1. Google是如何做Code Review的?| CSDN原力计划
  2. 飞书与IAI国际广告奖,协同实现国内营销史上的创新“云终审”
  3. android View.isShown() 和 getVisibility() 的区别
  4. Spring Boot的Tomcat 启动详解
  5. Django搭建个人博客:上传头像图片
  6. SAP S/4HANA分层存储仓库原理介绍LREP - Layered Repository
  7. 非类型模板参数(参考《C++ Templates 英文版第二版》)
  8. 【转】WPF调用图片路径,或资源图片
  9. 说说普通人挣钱的思路
  10. 信息学奥赛一本通 1009:带余除法 | OpenJudge NOI 1.3 04
  11. 《转》sql优化的几种方法
  12. python set 和 ^ 的妙用
  13. python中args是什么意思_理解Python中的*,*args
  14. 【面试那点儿事】囧,分机号的故事
  15. 拓端tecdat|R语言K-means和层次聚类分析癌细胞系微阵列数据和树状图可视化比较
  16. 【Stanford Online】Engineering: Algorithms1 NO.4 The Master Method
  17. 全新企业发卡系统源码/带有代理功能发卡平台源码
  18. hpm1216nfh驱动程序_惠普m1216nfh
  19. WebRTC 概念介绍--一篇读懂source、track、sink、mediastream
  20. Windows 启动项被误删除,EFI分区误格式化恢复

热门文章

  1. node下载指定版本
  2. Web实现:单行文本超出省略文本溢出省略
  3. ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法
  4. h5页面时间日期 在苹果手机出错 解决方法
  5. 日记侠:撰写吸粉文案的5大步骤
  6. 下载的python为什么安装不了软件_Python怎么下载安装
  7. Java开发者文档(开发软件+规范)
  8. springmvc集成shiro后,session、request姓汪还是姓蒋?
  9. 物通博联持续参与京东方(BOE)工厂数字化项目
  10. PHP代码加密+扩展解密实战