Django 【补充】ORM跨表查询补充

models.Book.objects.filter(**kwargs): querySet [obj1,obj2]
models.Book.objects.filter(**kwargs).values(*args) : querySet [{},{},{}]
models.Book.objects.filter(**kwargs).values_list(title) : querySet [(),(),()]

跨表查询总结:

1、创建表

class Book(models.Model):
  title = models.CharField(max_length=32)

  publish=models.ForeignKey("Publish") # 创建一对多的外键字段
  authorList=models.ManyToManyField("Author") # 多对多的关系,自动创建关系表

class Publish(models.Model):
  name = models.CharField(max_length=32)
  addr = models.CharField(max_length=32)

class Author(models.Model):
  name=models.CharField(max_length=32)
  age=models.IntegerField()

  ad=models.models.OneToOneField("AuthorDetail") #创建一对一的关系

class AuthorDetail(models.Model):
  tel=models.IntegerField()

2、基于对象关联查询: 

if 一对多查询(Book--Publish):
  正向查询,按字段:
  book_obj.publish : 与这本书关联的出版社对象 book_obj.publish.addr: 与这本书关联的出版社的地址
  反向查询,按表名_set
  publish_obj.book_set: 与这个出版社关联的书籍对象集合 publish_obj.book_set.all() :[obj1,obj2,....]

if 一对一查询(Author---AuthorDetail):
  正向查询,按字段:
  author_obj.ad : 与这个作者关联的作者详细信息对象

  反向查询:按表名:
  author_detail_obj.author : 与这个作者详细对象关联的作者对象

if 多对多(Book----Author):

  正向查询,按字段:

  book_obj.authorList.all(): 与这本书关联的所有这作者对象的集合 [obj1,obj2,....]

    book_obj.authorList.all().values("name"): 如果想查单个值的时候可以这样查

  反向查询,按表名_set:
  author_obj.book_set.all() : 与这个作者关联的所有书籍对象的集合

  book_obj.book_set.all().values("name"): 如果想查单个值的时候可以这样查

基于双下滑线的跨表查询:

if 一对多查询(Book--Publish):
  正向查询,按字段:

 # 查询linux这本书的出版社的名字:
  models.Book.objects.all().filter(title="linux").values("publish__name")

  反向查询:按表名:

# 查询人民出版社出版过的所有书籍的名字
  models.Publish.objects.filter(name="人民出版社出版").values("book__title")

if 一对一查询(Author---AuthorDetail):
  正向查询,按字段:

#查询egon的手机号
  models.Author.objects.filter(name="egon").values("ad__tel")

  反向查询:按表名:

#查询手机号是151的作者
  models.AuthorDetail.objects.filter(tel="151").values("author__name")

if 多对多(Book----Author):
  正向查询,按字段:

#查询python这本书的作者的名字
  models.Book.objects.filter(title="python").values("authorList__name") [{},{},{},{}]

  正向查询,按表名:

#查询alex出版过的出的价格
models.Author.objects.filter(name="alex").values("book__price")

注意:

publish=models.ForeignKey("Publish",related_name="bookList")
authorlist=models.ManyToManyField("Author",related_name="bookList") 
ad=models.models.OneToOneField("AuthorDetail",related_name="authorInfo")
反向查询的时候都用:related_name的值

聚合查询:
querySet().aggregate(聚合函数)------返回的是一个字典,不再是一个querySet
Book.objects.all().aggregate(average_price=Avg(‘price‘))

分组查询:
querySet().annotate() --- 返回的是querySet

#统计每一个出版社中最便宜的书籍的价格

sql:   select Min(price) from book group by publish_id;
ORM:  models.Book.objects.values("publish__name").annotate(Min("price"))

原文地址:https://www.cnblogs.com/xiaohema/p/8456310.html

时间: 2024-11-07 12:47:53

Django 【补充】ORM跨表查询补充的相关文章

ORM跨表查询

首先,在项目中添加我们要查询的模型,并插入数据 在django根目录下创建一个查询的py文件,供我们测试 ORM跨表查询可以分为基于  对象的查询(子查询)  和基于 queryset(双下划线__) 的查询 基于对象的查询(子查询) 一对多的查询 正向查询:在有关联字段的表向被关联的表查询 一对多的正向查询(正向查询按字段) 查询名为 python开天辟地 这本书的出版社的邮箱 book_obj = models.Book.objects.filter(title="python开天辟地&qu

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

Django之ORM跨表操作

一.准备数据库 models.py文件内容: from django.db import models # Create your models here. class Book(models.Model):     title=models.CharField(max_length=32)     price=models.DecimalField(max_digits=6,decimal_places=2)     create_time=models.DateField()     mem

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

django中的跨表查询梳理

1.前言 最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系.当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下. 2.概念 在开始之前,先明确几个基础概念: 正向查询:关联字段所在的表查询其关联表叫正向查询 反向查询:未写关联字段的表查询其关联表叫反向查询 # 书籍表 class Book(models.Model): name = models.CharField(max_length=32) publish = models.Forei

django之ORM跨表

跨表   正:        1. q = UserInfo.objects.all().first()     q.ug.title         2.      UserInfo.objects.values('nid','ug_id')                   UserInfo.objects.values('nid','ug_id','ug__title')          3. UserInfo.objects.values_list('nid','ug_id','ug

跨表查询

跨表查询 一.ORM 跨表查询 class Book(models.Model): title = models.CharField(max_length=32) publish = models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE) authors = models.ManyToManyField(to = "Author",related_name='b

13.Django之数据库models&orm连表操作补充以及其他知识点补充(二)

一.外键关联. 假如说,现在有两张表,一张user表,这个表中存放了用户账户信息,还有一张usertype表,这张表存放了用户账户的类型. from django.db import models class UserType(models.Model): #用户类型表,虽然没有创建ID字段,但是ID字段会自动创建. type = models.CharField(max_length=32) class User(models.Model): #用户表 username = models.Ch