zoukankan      html  css  js  c++  java
  • Django模型层(models.py)之多表操作

    添加表记录

    一对多:

        # 方式1:
        publish_obj = Publish.objects.get(id=1)
        Book.objects.create(name='2号图书',price=200,publishs=publish_obj)
        # 方式2:
        Book.objects.create(name='3号图书',price=300,publish_id=1)
    

     多对多:

        book_obj = Book.objects.filter(name='2号图书').first()
        author1_obj = Author.objects.get(name='1号作者')
        author2_obj = Author.objects.get(name='2号作者')
        book_obj.authors.add(author1_obj,author2_obj)
    

    查询表记录

    • 方式1:基于对象
    • 方式2:基于双下划线

    一对一:

        # 反向查询
        # 方式1:
        author_detail_list = AuthorDetail.objects.filter(addr='地址')
        for obj in author_detail_list:
            print(obj.author.name)
        # 方式2:
        AuthorDetail.objects.filter(author__name='2号作者').values("addr")
        # 正向查询
        # 方式1:
        Author.objects.filter(name='1号作者').first().authordetail.addr
        # 方式2:
        Author.objects.filter(name='1号作者').values("authordetail__addr")
    

     一对多:

    # 正向查询(按字段)
    # 方式1:
    # 查询1号图书的出版社名字
    Book.objects.filter(id=1).first().publishs.name
    # 方式2:
    # 查询1号图书的出版社名字和地址
    Book.objects.filter(id=1).values_list("publishs__name","publishs__addr")
    
    # 反向查询(按表名:表名_set)
    # 方式1:
    # 查询1号出版社出版的所有书籍
    Publish.objects.get(name='1号出版社').book_set.all()
    # 方式2:
    # 查询1号图书的出版社的名字和地址
    Publish.objects.filter(book__id = 1).values_list("name","addr")
    

    多对多:

       同一对多

     聚合查询:

      aggregate(*args, **kwargs)

        返回一个字典,键为聚合值的标识符,可以自由指定,也可以不指定

      example:

    # 不指定键
    Book.objects.all().aggregate(Avg("price"))
    # 指定键
    Book.objects.all().aggregate(price_avg = Avg("price"))
    

     分组查询:

      example:

        # 单表
        # ret = Book.objects.values("price").annotate(Count("id"))
        # 多表
        ret = AuthorDetail.objects.values("addr").annotate(c  = Count("author")).values("addr","c")
        # 多表分组等同于join关联表,再分组查询
    

     F查询:

      进行字段值之间的比较,支持对象与常数之间,对象与对象之间的加减乘除和取模运算。

      example:

    from django.db.models import F
    # 查询阅读数量大于浏览数量的
    Book.objects.filter(readNum__lt=F('scanNum'))
    

     Q查询:

      支持与、或、非及其它复杂查询,可以与关键字参数一起使用,但Q对象要放在前面

      example:

    from django.db.models import Q
    Book.objects.filter(Q(authors__name="2号作者")|Q(authors__name="1号作者"))
    
  • 相关阅读:
    命令[34]
    命令[33]
    命令[27]
    命令[38]
    命令[19]
    命令[22]
    命令[30]
    命令[37]
    命令[23]
    命令[26]
  • 原文地址:https://www.cnblogs.com/shannen/p/11285154.html
Copyright © 2011-2022 走看看