DAY77-Django框架(八)

今日内容:创建多表模型、多表数据操作、基于对象的跨表查询、基于双下划线的跨表查询

一、创建多表模型

class Author(models.Model):# id如果不写,会自动生成,名字叫nid,并且自增id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)sex = models.IntegerField()#一对一的关系:OneToOneField(to='表名',to_field='主键')#OneToOneField相当于ForeignKey(unique=True),唯一性约束,但是会报警告,不建议用authordetail = models.OneToOneField(to='AuthorDetail',to_field='id')class AuthorDetail(models.Model):id = models.AutoField(primary_key=True)phone = models.CharField(max_length=32)addr = models.CharField(max_length=64)class Publish(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)addr = models.CharField(max_length=64)email = models.EmailField()class Book(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)price = models.DecimalField(max_digits=6,decimal_places=2)#一对多的关系:ForeignKey(to='表名',to_field='主键')publish = models.ForeignKey(to='Publish',to_field='id')#多对多的关系:ManyToManyField会自动创建第三张表authors = models.ManyToManyField(to='Author')

二、多表数据操作

一对多

#添加数据
#方式一
book = models.Book.objects.create(name='三国演义',price=25.89,publish_id=1)
#方式二,存对象
#pk是指主键,id不一定是主键。
publish = models.Publish.objects.filter(pk=1).first()
book = models.Book.objects.create(name='金瓶',price=69.96,publish=publish)#删除数据
#操作与单表一样#修改数据
#与添加一样
#方式一
book=Book.objects.filter(pk=1).update(publish=出版社对象)
book=Book.objects.filter(pk=1).update(publish_id=1)
#方式二
book=Book.objects.get(pk=1)
book.publish=出版社对象 | book.publish_id=2
book.save()

多对多

author1 = models.Author.objects.get(name='小明')
author2 = models.Author.objects.get(name='小红')
book = models.Book.objects.get(name='红楼梦')#add:添加数据
#方法一:添加作者对象
book.authors.add(author1,author2)
#方法二:添加作者ID
book.authors.add(1,2)#remove:删除数据,可以删除一个或多个
#方法一:删除作者对象
book.authors.remove(author2)
#方法二:删除作者ID
book.authors.remove(1)#clear:清空对象中的所有
book.authors.clear()#set:先清空,在新增,要传一个列表,列表内可以是, id,也可以是对象,但是不要混用
book.authors.set([2,3])

三、基于对象的跨表查询

一对一

#正向:关联字段在哪里,从哪里开始就是正向。正向查询按字段
#查询小明作者的手机号
author = models.Author.objects.filter(name='小明').first()
authordetail = author.authordetail#authordetail是字段名
print(authordetail.phone)#反向:反向查询按表名小写
#查询地址是北京的作者名字
authordetail = models.AuthorDetail.objects.filter(addr='北京').first()
author = authordetail.author#author是表名
print(author.name)

一对多

#正向:正向查询按字段
# 查询红楼梦这本书的出版社邮箱
book = models.Book.objects.filter(name='红楼梦').first()
publish = book.publish
print(publish.email)#反向:反向按表名小写_set.all()
# 查询地址是北京 的出版社出版的图书
publish = models.Publish.objects.filter(addr='北京').first()
book = publish.book_set.all()
print(book)

多对多

#正向:正向查询按字段.all()
#查询红楼梦这本书所有的作者
book = models.Book.objects.filter(name='红楼梦').first()
author = book.authors.all()
print(author)#反向查询:反向按表名小写_set.all()
#查询小明写的所有书
author = models.Author.objects.filter(name='小明').first()
book = author.book_set.all()
print(book)

注:基于对象的查询,其本质就是多次查询(子查询)

四、基于双下划线的跨表查询

一对一

#正向:关联字段在哪里,从哪里开始就是正向。正向查询按字段
#查询小明作者的手机号
phone = models.Author.objects.filter(name='小明').values('authordetail__phone')
print(phone)#反向:反向查询按表名小写
#查询地址是北京的作者名字
name = models.AuthorDetail.objects.filter(addr='北京').values('author__name')
print(name)

转载于:https://www.cnblogs.com/xvchengqi/p/9953909.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Async Await

接着上一篇Generator co的使用 https://juejin.im/post/5ab51336f265da239d493ff4 这里继续说说js异步处理的方法 async await( 即Generator的语法糖) async 是“异步”的简写,async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行…

Java对象到对象映射器

我在该项目上使用了Dozer一段时间。 但是,最近我遇到了一个非常有趣的错误,它促使我环顾四周,并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表: 推土机:推土机是Java Bean到Java Bean的映射器&#xff…

android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

在之前的项目中用到了视频播放的功能,在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能。JiaoZiVideo的简单使用集成了JiaoZiVideo后仅需这几行代码就可以实现播放视频JZVideoPlayerStandard jzVideoPlayerStandard (J…

送福利:ROKID 语音开发板免费送,开启你的物联网之旅

都让一让,我说个事情:掘金联合 Rokid 开发者社区给大家发福利啦! 掘金联合 Rokid 开发者社区为大家准备了一些福利,只要秀出你的 skill 和技术栈,就有可能获得 Rokid 全栈语音智能开发套件。 ? Rokid开箱试用活动 活…

点击复制文本

点击按钮,进行文本复制操作。实现这个功能需要二点; 一:用window.getSelection().selectAllChildren(“”)获取要复制的内容 二:用document.execCommand ("Copy");进行复制操作 关键代码 window.getSelection().selec…

6.25

TEXT 94 Cancer biology 肿瘤生物学 Cramping tumours 断了肿瘤的活路(陈继龙编译) Jan 18th 2007 From The Economist print edition An old observation about cancer cells may lead to a new treatment 早年发现的肿瘤细胞的一个特征可能为治疗肿瘤打…

Java Lambdas简介

Java 8的主题是lambdas。 我已经注意到,对于许多Java程序员来说,lambda都是非常难的材料。 因此,让我们尝试对它们有一个基本的了解。 首先,lambda到底是什么? Lambda是一个匿名函数,与常规函数不同&#…

ios html清除缓存图片,iOS,如何清理缓存的图片

通常,在我们加载图片的时候,一般都会做缓存处理,像SDWebImage,YYWebImage都是有的,但是有缓存,当然也需要清理缓存,如果没有这个功能的话,显得app太没人性化。获取总的缓存大小// 获取某个路径下…

搭建一个项目的前期准备

后端:node(驱动) mogodb(数据库) express(node框架) mongoose(快速建模工具) moment.js(时间和日期格式化) jade(模板引擎)前端: jquery(类库) bootstrsop(样式框架) bower(npm模块)本地环境:less cssmin jshint uglifyjs mocha …

ZOJ1081 Points Within

在解析几何中,我们大量的使用列方程求解未知量。但是在计算机计算的时候,解析几何的算法因为使用除法过多可能会带来严重的精度误差,所以简单来说,计算几何使用了一些其他的等效的方法来解决这些问题。 这里先说一个比较基础的题目…

如何使用JavaScript控制台改进工作流程

作为Web开发人员,很有必要了解如何调试代码。后台开发我们经常使用外部库来记录日志,并在某些情况下格式化显示日志,前端我们会使用断点和控制台,但是我们浏览器的控制台比我们想象的要强大得多。 当我们考虑控制台时&#xff0c…

如何在OpenJDK中使用ECC

曾经试图在Java和OpenJDK中使用椭圆曲线密码术 (ECC)的每个人要么被迫使用Bouncy Castle,要么被SunEC提供者弄糊涂了 。 SunEC提供程序根据文档 (报价)提供以下算法: AlgorithmParameters 欧共体 KeyAgr…

html 文本框数量加减,收藏!js实现input加减

好的程序员是会复制粘贴的,这样说好像会被唾弃的。。。。。html减号按钮点击事件function subtraction(){//获取-号按钮var subtraction document.getElementById("subtraction");//获取文本框var number document.getElementById("number");…

select、poll、epoll之间的区别总结[整理]

原文:https://www.cnblogs.com/Anker/p/3265058.html 好文章收藏下,慢慢品味 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者…

JPA(七):映射关联关系------映射双向多对一的关联关系

映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone;import java.util.Date; import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; impo…

如何优雅的绘制一棵省市区三级可选择的树?

开始 总结一下 开发过程中的思路想法 各位大佬们看看就好 首先你拥有的数据结构 所有省市区的信息列表 以及已经选中的信息 用的是element-ui的 el-tree const cityStorage {provinceList:[{id: 1, provinceId: "110000", name: "北京市"}],//所有省ci…

html click事件 参数,vue 实现click同时传入事件对象和自定义参数

这篇文章主要介绍了vue 实现click同时传入事件对象和自定义参数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧仅仅传入自定义参数HTMLdddddJS代码new Vue({el:#app,methods:{tm:function(e){console.log(e);}}})仅仅传入事件对象HTML…

向SAML响应中添加自定义声明–(如何为WSO2 Identity Server编写自定义声明处理程序)...

总览 最新版本的WSO2 Identity Server(版本5.0.0)配备了“应用程序身份验证框架”,该框架提供了很大的灵活性,可以对来自使用异构协议的各种服务提供商的用户进行身份验证。 它具有多个扩展点,可用于满足企业系统中常见…

Android学习(七)—— Android布局

Android布局 1、LinearLayout 线性布局,这种布局在平时的开发中用的最多,内部控件只能水平或竖直进行排列,在搭建较复杂的界面时会有点麻烦。 常用属性 android:orientation 控制控件排列方向,属性值为垂直(vertical…

不一样的ZTree,权限树.js插件

每一个有趣的创新,都源于苦逼的生活。在最近的工作中,遇到一个做权限管理筛选的需求。 简单总结需求: 1展示一个组织中的组织结构 2通过点击组织结构中的任意一个节点可以向上向下查询对应的组织结构 如果你不想苦逼的重复劳动,还…