$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')
随机推荐
- 理解self与this
刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?你看完这篇文章后就会明白所有的疑问. self代表类的实例,而非类. ...
- bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...
- cdqz2017-test1-数论 (BSGS + 二次剩余 + CRT)
若m=0, 就是求n^2n ≡ x mod p (x--) 因为一定优解,所以x一定是p的二次剩余 令g为p的1个原根,且g^k ≡ x mod p 则k是偶数,证明k是偶数: 假设 g1^k1 ≡ ...
- HDU 1064(求平均数 **)
题意是求 12 个浮点数的平均数,这题不用读题,看到运行时间为 200 ms 再看下样例就能猜出题目的要求了,代码如下: #include <bits/stdc++.h> using na ...
- Golang入门教程(六)关键字和数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. 一.25个关键字 二.18 ...
- Python3.6 Schedule模块定时任务
本文使用Python的Schedule模块.Python访问数据库的框架SQLAIchemy 实现了一个:周期性读取mysql 数据的小示例. 一,编程环境 PyCharm2016,Anaconda3 ...
- (15)DeleteColumnsMakeSortedIII
一.问题描述 给定一个字符串形的数组,求最小的删除数目,使得删除后的字符串是字典型有序的. 二.思路Code package algorithm; /** * Created by adrian.wu ...
- nginx: [error] CreateFile() "E:\nginx\nginx-1.9.3/logs/nginx.pid" failed
nginx: [error] CreateFile() "E:\nginx\nginx-1.9.3/logs/nginx.pid" failed nginx: [error] Op ...
- 【webpack】使用DllPlugin拆分模块
开发过程中,我们经常需要引入大量第三方库,这些库并不需要随时修改或调试,我们可以使用DllPlugin和DllReferencePlugin单独构建它们. 具体使用如下: const HtmlWebp ...
- window 安装gcc交叉编译器
参考网址: https://blog.csdn.net/zsy19881226/article/details/46952535