python-day71--django多表操作
表关系:
1 一对多
2 多对多
3 一对一 添加记录: 一对多:书与出版社 #创建一对多:
publish=models.ForeignKey("Publish")
注意:publish不用写成publish_id,"Publish" 默认找Publish表的主键
#添加记录方式1:
models.Book.objects.create(name='红楼梦',publish_id=1)
#添加记录方式2:
# pubObj=models.Publish.objects.filter(name="人民出版社")[0]
# models.Book.objects.create(name='红楼梦',publish=pubObj) # 关联的出版社对象 多对多:书与作者
创建多对多关系:
authorlist=models.ManyToManyField("Author")
多对多添加记录:
先创建Book对象,→ 对象.authorlist.add(作者对象) book_obj=models.Book.objects.create(title="追风筝的人", price=100, publishDate="2017-12-12", publish_id=2) alex_obj=models.Author.objects.filter(name="alex")[0]
egon_obj=models.Author.objects.filter(name="egon")[0] book_obj.authorlist.add(alex_obj,egon_obj)
解除多对多关系:
先找到书对象→书对象.authorlist.remove(作者对象) 清除多对多关系:
先找到书对象→书对象.authorlist.clear()一对一:
创建一对一关系
创建出版社与出版社详情一对一关系:
pubdetail=models.OneToOneField('Pubdetail') 在创建表的关联时 也可以指定哪个表和哪个字段,用 to 的形式
models.ForeignKey(to="Publish",to_field="nid") 多对多和多对一同理 查询记录:
正向查询:
一对多:
linux_obj=models.Book.objects.filter(title="linux").first()
print(linux_obj.publish.name) # 与这本书对象关联的出版社对象的名字 多对多:
先找到要找的书对象→对象.authorlist.all()
linux_obj=models.Book.objects.filter(title="linux").first()
print(linux_obj.authorlist.all()) # 与这本书关联的所有作者对象集合 一对一:
查找书的出版社的地址
先找到书对象→出版社对象→出版社对象.pubdetail.addr
反向查询: book_set 是在创建关系的时候默认创建的,用于反向查询 #一对多的反向查询: eg:人民出版社出版过的书籍的名字
先找到出版社对象→出版社对象.book_set.all()
publish_obj=models.Publish.objects.filter(name="人民出版社")[0]
print(publish_obj.book_set.all()) # 与该年出版社关联的所有书籍对象的集合 #多对多的反向查询: 查询yuan出版过的所有书籍的名字和价格:
先找到作者对象→作者对象.book_set.all()
author_yuan=models.Author.objects.get(name="yuan")
print(author_yuan.book_set.all()) # 与该作者关联的所有书籍书籍对象的集合 #一对一的反向查询:
查找地址为北京的出版社出版的所有书
出版社详情表的对象.pubdetail.book.all() 注意:在已有记录的表中新增字段时需设置默认值(让已有的记录在该字段显示默认值),并且重新迁移数据库
直接赋值:
通过赋值一个新的可迭代的对象,关联对象集可以被整体替换掉。 >>> new_list = [obj1, obj2, obj3]
>>> book_obj.author = new_list
#直接替换 ,多对一和一对一想换值同样可以使用直接替换 book_obj.publish=new_publish_obj .....
如果外键关系满足null=True,关联管理器会在添加new_list中的内容之前,首先调用clear()方法来解除关联集中一切已存在对象的关联。否则, new_list中的对象会在已存在的关联的基础上被添加。
python-day71--django多表操作的更多相关文章
- Python之Django--ORM连表操作
一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Mo ...
- Python - SQLAlchemy之连表操作
ORM的两种创建方式 数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码 代码优先:就是先写代码,然后根据代码去生成数据库结构. ...
- Django单表操作
一.数据库相关设置 配置ORM的loggers日志: # 配置ORM的loggers日志 LOGGING = { 'version': 1, 'disable_existing_loggers': F ...
- Python学习---Django的基础操作180116
Django创建数据库操作 django流程之model实例 settigs.py:更改Django2.0.1的配置,更新为之前的路径配置 'DIRS': [os.path.join(BASE_DIR ...
- Python之MySQL库表操作
一:库操作 1.1 增 # 语法 # create database 库名 default charset utf8; create database db1 default charset utf8 ...
- $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...
- Django分表操作、聚合及FQ方法
聚合 aggregate(*args, **kwargs) # 计算所有图书的平均价格 from django.db.models import Avg Book.objects.all().aggr ...
- Django多表操作
多表创建 创建模型 下面通过一个简单的图书管理系统,来阐述多表的创建和查询操作 在视图函数里里定义如下代码 from django.db import models class Book(models ...
- django单表操作,增、删、改、查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
- django单表操作 增 删 改 查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
随机推荐
- 中国程序化购买广告解析:RTB/DSP/Ad Exchange/SSP/DMP,思维导图
中国程序化购买广告解析:RTB/DSP/Ad Exchange/SSP/DMP 概念 程序化购买( Programmatic Buying):通过数字化.自动化.系统化的方式改造广告主.代理公司.媒体 ...
- 用Python实现随机森林算法,深度学习
用Python实现随机森林算法,深度学习 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩 ...
- redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐
redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐 1.Redis 官方网站下载: http://redis.io/dow ...
- python+requests接口自动化测试
转自https://my.oschina.net/u/3041656/blog/820023 原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测 ...
- web前端----jQuery基础语法
一.jQuery基础1.为什么要用jquery? 写起来简单,省事,开发效率高,兼容性好2.什么是jQuery? jQuery是一个兼容多浏览器的JavaScript库(类似python里面的模块)3 ...
- 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现
20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...
- Codeforces Round#413 Problem A - C
Problem#A Carrot Cakes vjudge链接[here] (偷个懒,cf链接就不给了) 题目大意是说,烤面包,给出一段时间内可以考的面包数,建第二个炉子的时间,需要达到的面包数,问建 ...
- noip2010 真题练习 2017.2.18
第一题比较简单,用exist数组判断是否在循环队列中,就可实现线性算法. Code #include<iostream> #include<cstdio> #include&l ...
- ASP.NET MVC之Bundle压缩JS和CSS
介绍Bundle之前先引用<淘宝技术这十年>中一段话,对Web前端稍微有点常识的人都应该知道,浏览器下一步会加载页面中用到的CSS.JS(JavaScript).图片等样式.脚本和资源文件 ...
- java反射基础
转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?opt=1最近在接触到框架的底层的时候,遇到了反射,便想好好的学习和总结一下反射,帮助理解java框架的运行流 ...

一对一: