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号作者"))

猜你喜欢

转载自www.cnblogs.com/shannen/p/11285154.html