$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
import os
if __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')
随机推荐
- Maccms8.x 命令执行漏洞分析
下载链接https://share.weiyun.com/23802397ed25681ad45c112bf34cc6db 首先打开Index.php $m = be('get','m'); m参数获 ...
- Mysql查看表的建表语句
已查询Test的建表语句为例: SHOW CREATE TABLE TEST
- weblogic的基本概念
1.Domain,Administration Server, Managed Server 域包含一个或多个 WebLogic Server 实例. Domain 中包含一个特殊的 WebLogic ...
- Excel复制粘贴假死
把打印机都删除了试一下. 如果还有问题,就把迅雷监听关掉.
- 阻塞式I/O实现简单TCP通信
一.技术简介 (1)服务端打开两个端口9999和6666监听外来连接: (2)服务端的子进程通过端口9999监听外来消息,通过端口6666发送消息: (3)客户端的子进程处理外来消息,父进程发送消息 ...
- 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数
34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...
- sqlserver二进制存储
CREATE TABLE myTable_yq(Document varbinary(max),yq varchar(20)) --SELECT @xmlFileName = 'c:\TestXml. ...
- moment.js 时间戳转换
1. 一段时间以0点为标准 : 2018-03-15 00:00:00- 2018-03-21 00:00:00 let startTime = moment('2018-03-15').format ...
- luogu P3722 [AH2017/HNOI2017]影魔
传送门 我太弱了,只会乱搞,正解是不可能正解的,这辈子不可能写正解的,太蠢了又想不出什么东西,就是乱搞这种东西,才能维持得了做题这样子 考虑将询问离线,按右端点排序,并且预处理出每个位置往前面第一个大 ...
- vue框架导入百度地图API接口的方法
百度请求API接口: