$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

时间:2021-12-11 23:58:05

0在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')

$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

# 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')

$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

# *************重点
  # 一对一的关系: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')

$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

5.修改

models.User.objects.filter(id=1).update(name='wd')

随机推荐

  1. EditPlus快捷键

    Editplus 选中一行: ctrl+rEditplus 复制一行: ctrl+r选择行,然后ctrl+c复制.复制一行到下一行中:Editplus有:Ctrl+j 复制上一行的一个字符到当前行Ed ...

  2. ci框架里rewrite示例

    ci里新建应用app,入口文件app.php. Nginx 这里附上vhost配置 app.52fhy.com.conf server { listen 80; server_name app.52f ...

  3. java理论基础学习三

    Eclipse 是一个开放源码的.基于java的可扩展开发平台 最初主要用来java语言开发,但目前也有人通过插件使其作为其它计算机语言比如C++.python.安卓的开发 下载地址:http://e ...

  4. 【Linux安全】安全口令策略设置

    命令: vim /etc/login.defs 默认设置: # Password aging controls: # # PASS_MAX_DAYS Maximum number of days a ...

  5. OC语言-03NSString

    /* 1. @"kite" 这是一个OC字符串,OC的字符串也是一个对象, 由NSString类(继承于NSObject) 创建 2. 输出时使用 %@ 3. 对象方法 [对象名 ...

  6. win10安装spacemacs

    参考: https://www.cnblogs.com/e190/p/10404927.html https://blog.csdn.net/u011729865/article/details/54 ...

  7. MyBatis # $区别

    方式一: <select id="getUserById" resultType="User" parameterType=”int”> SELEC ...

  8. hibernate NUMBER 精度

    通过Hibernate映射实体时会根据数据库中NUMBER类型的精度,生成相应的POJO类中相对应的主键类型.经过亲测结果如下: NUMBER(1) POJO类中生成的是Boolean publicc ...

  9. Linux下文件的三种时间标记(atime ctime mtime)

    在windows下,一个文件有:创建时间.修改时间.访问时间. 在Linux下,一个文件有:状态改动时间.修改时间.访问时间. 1)查看文件(或文件夹)的三种时间标记 (stat 命令) Access ...

  10. 算法题:整形数组找a和b使得a&plus;b&equals;n

    题目: 数组 A 由 1000 万个随机正整数 (int) 组成,设计算法,给定整数 n,在 A 中找出 a 和 b,使其符合如下等式: n = a + b 解题思路: 1. 1000w个随机正整数占 ...