ORM多表增删改查

一 创建多表

在models.py里创建4张表:Author(作者)、AuthorDetail(作者详细信息)、Publish(出版社)、Book(书)

四张表关系为:

(1)首先创建一对一关系。OneToOneField()

创建Author表

class Author(models.Model):

name=models.CharField( max_length=32)
age=models.IntegerField()
authorDetail=models.OneToOneField(to="AuthorDetail",to_field="id",on_delete=models.CASCADE)

models.OneToOneField是创建一对一关系的关键字,to="AuthorDetail"表示和AuthorDetail表创建一对一关系。to_field="id"表示关联字段,不写默认为Id(主键)。on_delete=models.CASCADE表示级联删除。(注:to后面的表名和字段都是字符串形式)。创建一对一关系,生成authorDetail,这个为关联属性。通过Author找AuthorDetail表中的内容就要通过这个关联属性。(生成一对一的表,会在关联的表生成字段:authorDetail_id)

(2)创建AuthorDetail表

class AuthorDetail(models.Model):
    birthday=models.DateField(),
    telephone=models.CharField(max_length=32) ,
    addr=models.CharField( max_length=64)
        

(3)然后创建多对一关系。ForeignKey()

外键字段要加在多的一方,即Book表。

Book表和Publish通过ForeignKey连接起来,生成Publishs关联属性。

再建Publish表:

(4)建立多对多关系ManyToManyField

Book表和Author具有多对多关系。可以在任何一张表加。选择在Book表加:

(5)最后生成详细字段关系表

蓝色的只是类里面的关联属性,在表中没有这个字段,只有相应的id字段。

二 添加记录。

利用django的admin.py文件添加记录。

(1)首先在admin.py配置注册字段:

(2)在终端里输入:

Python manage.py createsuperuser创建超级用户

(3)在浏览器输入:http://127.0.0.1:8000/admin/登陆页面,和数据库同步,即可添加数据。

三 在视图函数中增删改查

1.增加

A.一对一

方式一:(常用)           通过id方式

先找到AuthorDetail中的那条记录,并生成obj对象。然后再创建Author记录时,让authorDetail_id=obj.id(Author表中有authorDetail_id字段的)

方式二:

首先创建好一个new_author_detail对象。然后创建Author记录时通过authorDetail等于该对象,就建立两者一对一关系。(不需要再查找一遍了)

B.一对多

方式一:(常用)(id连接)

同一对一增加一样。可以直接把Obj放在等式里。

方式二:(类属性连接)

C多对多

方式一(常用)

直接再Book表(关联表/有关联属性的)找到要添加的那条记录,然后调用Book的关联属性添加到指定的记录。

可以添加多个。方式为*[3,6]。里面的数字是id。

多对多(两张表的记录都已经存在,建立两者对应关系)

方式二:

先找到要添加的对象Book表的和Author表的。然后调用Book表的对象的author属性的add方法,添加Author表的对象。

2.删除

一对一和一对多的删除和单表删除是一样的。但要考虑级联删除。

级联删除原则:

我和你关联,你不能随便删-----------》你删我也删(级联)

我可以随便删,我删了对你没影响

(1)一对一

2是关联表中的内容,直接.deledte找到的记录,对被关联表没有影响。但1中删除了id为2 的记录,则在关联表中和id为2(即authorDetail_id=2)的记录也都删除了。(有关联id的那个值没了,这条id值对应的那条记录也没了)

(2)一对多

(3)多对多

多对多删除就是删除第三张表的两者对应关系

和add方法对应。通过类的关联属性增删。

set方法--------》先clear,再add

3.更新

(1)一对一

更新方法.update()前必须用filter()查找。不能用get().update()要用queryset对象。

(2)一对多

(3)多对多

Set方法

原文地址:https://www.cnblogs.com/yq055783/p/12355463.html

时间: 2024-10-30 10:03:47

ORM多表增删改查的相关文章

django orm 单表增删改查

一 简单增删改查 1.增 User.objects.create(name='Alan', age=10, birthday='2018-08-08') user = User(name='Alan', age=10, birthday='2018-08-08') user.save() 2.查询 # 操作的结果拥有是一个list users = User.objects.filter(name='Owen') # 只能操作有且只有一条数据记录 user = User.object.set(id

Django 【第五篇】ORM单表增删改查

一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",course="python",birth="2000-9-9",fenshu=80) Frank_obj.save() # 方式二: models.Student.objects.create(name ="海燕",course="python

Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process using '"' #可以直接用 python3 -m pip 代替 pip3 #这个问题是pip3 版本过低直接在cmd中执行 python3 -m pip install --upgrade pip 更新pip3 # 在指定解释器环境下安装django 1.11.9 # 在真实python3环境

GZFramwork数据库层《三》普通主从表增删改查

运行结果: 使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGenerate/ 生成方式见第一节: GZFramwork数据库层<一>普通表增删改查   生成明细表ORM略有不同: 项目附加结果:   新增一个自定义控件:ucTableMD 界面:   后台代码: using System; using System.Colle

mybatis(单表增删改查)

(mybatis注意各个文件的映射问题) 用到的t_user数据库脚本: -- 导出 mybatis 的数据库结构 CREATE DATABASE IF NOT EXISTS `mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mybatis`; -- 导出 表 mybatis.t_user 结构 CREATE TABLE IF NOT EXISTS `t_user` ( `id` int(10) NOT NULL AUTO_INCREM

mybatis(单表增删改查useMapper版)

数据库脚本(注意测试时先add-->load-->update-->delete-->list)UserMapper版 -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: 5.5.36-MariaDB - mariadb.org binary distribution -- 服务器操作系统: Win32 -- HeidiSQL 版本: 8.0.0.4396 --

GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)

运行效果: 使用代码生成器(GZCodeGenerate)生成tb_EmpLeave的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGenerate/ 生成方式见上一节: GZFramwork数据库层<一>普通表增删改查     新增一个自定义控件:ucTableUnitDocNo   后台代码同上一节ucTableUnit除了实例化bllBusiness不一样外其他都一样(红色背景标注) using System; using

使用CI操作oracle 10g的单表增删改查

<?php if (!defined('BASEPATH'))    exit('No direct script access allowed'); class UseOra extends CI_Controller{ public function index()    {        echo '欢迎使用测试CI使用Oracle 10g 的功能,您可以在地址栏中使用如下的函数参数:<br>';        echo '=============================

再说“使用CI操作oracle 10g的单表增删改查”

--Control中的UseOra.php <?php if (!defined('BASEPATH'))    exit('No direct script access allowed'); class UseOra extends CI_Controller{ public function index()    {        echo '欢迎使用测试CI使用Oracle 10g 的功能,您可以在地址栏中使用如下的函数参数:<br>';        echo '=======