• ORM基础4 跨表查询+原子性操作


      一、跨表查询   
      1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj.publisher.name # print(ret) 2.# # 正向查找 字段查找 # ret = models.Book.objects.filter(id=3).values_list("publisher__name") # print(ret) 3.# # 反向查找 对象查找 # publisher_obj = models.Publisher.objects.get(id=1) # ret = publisher_obj.books.all().values_list("title") # print(ret) 4.# # 反向查找 字段查找 # ret = models.Publisher.objects.filter(id=1).values_list("books__title") # print(ret) # 多对多 # # 查询 author_obj = models.Author.objects.get(id=2) # print(author_obj.name) # ret = author_obj.book.all() # print(ret)   二、对象 多对多 对表与表之间的关系进行操作 1.# create 创建新对象 1、在book中创建一本新书,在book和author的关联表中添加关联操作 # author_obj.book.create(title="孩子", publisher_id=3) 2.# add 必须添加对象 或 id # book_obj = models.Book.objects.get(id=12) # author_obj.book.add(book_obj) # # add 多个 # book_obj = models.Book.objects.filter(id__gt=5, id__lt=8) # print(book_obj) # author_obj.book.add(*book_obj) # author_obj.book.add(12) 3.# # set 必须要是一个可迭代对象 # author_obj.book.set([8, 11]) # author_obj.save() 4.# remove 对象或id # # 对象 # book_obj = models.Book.objects.get(id=7) # author_obj.book.remove(book_obj) # id # author_obj.book.remove(5) 5.# # clear # new_author_obj = models.Author.objects.get(id=5) # new_author_obj.book.clear()    注意: models.类(表).操作(create add remove clear),必须要save()
      一对多也有clear和remove方法当时foreginkey必须添加null=True
       三、聚合分组查询 1.# 聚合 from django.db.models import Avg, Sum, Max, Min, Count # ret = models.Book.objects.all().aggregate(price_avg = Avg("price")) # print(ret) # ret = models.Book.objects.all().aggregate(min_price=Min("price")) # print(ret) # ret = models.Book.objects.all().aggregate(price_max=Max("price"), price_min=Min("price"), price_avg=Avg("price"), price_sum=Sum("price")) # print(ret) 2.# 分组查询 # 查询每一本书的作者个数 # ret = models.Book.objects.all().annotate(author_num=Count("author")) # for book in ret: # print("书名:{},数量:{}".format(book.title, book.author_num)) # 查询作者数量大于1的书 # ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1) # print(ret) # 查询各个作者出的书的总价格 # ret = models.Author.objects.all().annotate(price_sum=Sum("book__price")).values_list("name", "price_sum") # print(ret)    # 注意:按字段分组的时候,先获取字段,在分组
           一般 annotate(聚合函数)
      四、F和Q查询 注意: # F和Q 1.# 查询出 库存数 大于 卖出数的 所有书(两个字段做比较) from django.db.models import F # ret = models.Book.objects.filter(remain__gt=F("sale")) # print(ret)
       注意:F查询字段之间进行比较或加减乘除
    models.Book.objects.update(sale=(F("sale")+1)*3)
      2.# Q 用于表示或,一般用于filter
       格式:(字段)|(字段)

     锁

    所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。

    entries = Entry.objects.select_for_update().filter(author=request.user)
        五、原子性操作

      # 事物支持原子操作 try: from django.db import transaction with transaction.Atomic(): new_publisher = models.Publisher.objects.create(name="星火出版社") new_book = models.Book.objects.create( title="笑傲江湖", price=11.11, remain=10, sale=10, publisher_id=1000 ) except Exception as e: print(str(e)) # 事物操作不支持原子操作 try: models.Publisher.objects.create(name="天天出版社") models.Book.objects.create( title="", price=22.22, remain=10, sale=10, publisher_id=1000 ) except Exception as e: print(str(e))

    Django终端打印SQL语句

    # 在settings.py文件中的任意位置
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

     注意:value或value_list里的字段相当于SQL语句select 后面的字段

           annotate分类按照前面的字段进行分类

  • 相关阅读:
    centos7 升级openssh到openssh-8.0p1版本
    CentOS7.6安装docker最新版
    通过iptables限制docker容器端口
    nginx设置反向代理,获取真实客户端ip
    CentOS7.6使用Virt-manager创建虚拟机报错
    CentOS7添加/删除用户和用户组
    ubuntu14.04 部署nfs服务
    centos7 firewall指定IP与端口访问(常用)
    linux下yum安装最新稳定版nginx
    C语言中点操作符(.)和箭头操作符(->)
  • 原文地址:https://www.cnblogs.com/wt7018/p/11267648.html
Copyright © 2020-2023  润新知