$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境...
0在Python脚本中调用Django环境、
import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "工程名.settings") import django django.setup() from app01 import models
1 创建多表模型(详情见代码)
#用了OneToOneField和ForeignKey,模型表的字段,后面会自定加_id
class Zuozhe (models.Model): id = models.AutoField (primary_key=True) name = models.CharField (max_length=32) xiang = models.OneToOneField (to='Xiang', to_field='id')
# ManyToManyField会自动创建第三张表:格式如下
class Zuozhe (models.Model): id = models.AutoField (primary_key=True)
class Books (models.Model): id = models.AutoField (primary_key=True) name = models.CharField (max_length=32) price = models.DecimalField (max_digits=5, decimal_places=2) banse = models.ForeignKey (to=Banse, to_field='id') zuozhe = models.ManyToManyField (to='Zuozhe')
# *************重点
# 一对一的关系:OneToOneField
# 一对多的关系:ForeignKey
# 多对多的关系:ManyToManyField
2 添加表记录
1 一对多create
-两种方式:
-publish=对象 #创建时的字段=对象
-publish_id=id #数据库里的实际字段=id
models.Book.objects.create(name='红楼梦',price=34.5,publish_id=1)publish=models.Publish.objects.get (pk=1)models.Book.objects.create (name='西游记', price=34.5, publish=publish)
2 一对多删除:同单表删除 delete()
3 一对多修改:两种方式,可以传对象,可以传id, update()
4 一对一跟一对多一样
5 多对多: 注意这里是拿到对象在 增删改
-add ----->可以传对象,可以传id,可以传多个
# book=models.Books.objects.filter(name='添加1').first()# book.zuozhe.add(1,2)
-remove ----->可以传对象,可以传id,可以传多个
-clear ---->没有参数
-set 修改 ----->必须传可迭代对象(一般列表),列表里面可以是对象,可以是id (举例:这本书的作者,set([1,2,3] 表里有就不改动了,没有添加,这本书之前的其他作者删除))
book=models.Books.objects.filter(name='添加1').first()book.zuozhe.set ([3, 2, 1])
3 基于对象的跨表查询: 对象。跨表/跨表_set--->object对象 | None | None。all() 拿到一个queryset对象
1 一对一 :没有all,没_set
正向:正向查询按字段
# lqz=models.Zuozhe.objects.filter(name='lqz').first()# print(lqz.xiang.address)
反向:反向查询按表名小写
# phone=models.Xiang.objects.filter(phone='120').first()# print(phone.zuozhe.name)
2 一对多
正向:正向查询按字段
反向:反向按表名小写_set.all()
3 多对多
正向:正向查询按字段
# book=models.Books.objects.filter(name='水浒传').first()# print(book.zuozhe.all())# for i in book.zuozhe.all():# print(i.name)
反向查询:反向按表名小写_set.all()
lqz=models.Zuozhe.objects.filter(name='lqz').first()pp=lqz.books_set.all()print(pp)for i in pp : print(i.name)
4******基于对象的查询,多次查询(子查询)
总结: 多个.all()或者小写表名_set.all()
4 基于双下划线的跨表查询
-连表查询
-一对一双下划线查询
-正向:按字段,跨表可以在filter,也可以在values中
-反向:按表名小写,跨表可以在filter,也可以在values中
# models.Books.objects.filter(name__startswith='红').values('zuozhe__xiang__address').filter(zuozhe__xiang__address__startswith='北').values('zuozhe__xiang__sex')
5.修改
models.User.objects.filter(id=1).update(name='wd')
转载于:https://www.cnblogs.com/3sss-ss-s/p/9954210.html
最新文章
- 数据结构:最大子序列和
- nodejs 全局变量和全局对象
- 震惊!这些喵星人竟然被集体包养!
- 三 s5p4418对mcp2515 can总线的支持
- HDU 3264 Open-air shopping malls
- 在 Linux 下打包命令 tar 和压缩命令 7z 的配合使用示例
- 99%算法工程师不知道的if/else优化技巧
- elasticsearch 查看索引_ElasticSearch 索引基本操作
- 一定备足货!卢伟冰再曝红米骁龙855旗舰:性价比之王
- 都安排上了!春晚主持阵容、春晚直播平台、春晚餐桌C位
- Maven generate/构建项目太慢解决方法
- java 中之循环(for while do-while)详解
- 微服务 API 网关建设,实践经验分享!
- Javascript 笔记与总结(2-8)对象2
- Java - Java Mail邮件开发(3)spring +Java Mail + Velocity
- 多节点Linux部署
- idea设置控制台为单独的窗口
- 软银集团和共享办公空间公司WeWork在日本成立合资公司
- c#实现打印快递单-提供源码
- numastat命令详解
热门文章
- 泛型委托Action与ActionT
- Java初级学习(转载http://www.cnblogs.com/biehongli/p/5737612.html)
- [转]Linux系统下yum和apt-get的区别
- 04JavaScript中函数也是对象
- 为DataGrid创建自定义列控件(四)
- Android编译笔记一
- 关于SDIO接口的wifi和通用SD卡的一些记录
- s6-5 TCP 连接的建立
- 【鬼网络】之DHCP原理与配置
- w25n01g 代码_W25N01GV 驱动