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

    0在Python脚本中调用Django环境、

    import os
    if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "工程名.settings")
    import django
    django.setup()
    from app01 import models

     1 创建多表模型(详情见代码)
      #用了OneToOneFieldForeignKey,模型表的字段,后面会自定加_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')


     

  • 相关阅读:
    Spring如何处理线程并发问题?
    什么是spring?
    如何通过sql语句完成分页?
    哪一个List实现了最快插入?
    请说出作用域public,private,protected,以及不写时的区别?
    使用什么命令查看用过的命令列表?
    静态变量和实例变量的区别?
    使用什么命令查看磁盘使用空间? 空闲空间呢?
    什么是 Mybatis?
    是否可以继承String类?
  • 原文地址:https://www.cnblogs.com/3sss-ss-s/p/9954210.html
Copyright © 2011-2022 走看看