文档章节

django模型篇:一对一、一对多、多对多,添加,批量插入和查询操作

o
 osc_wws45aot
发布于 2019/08/20 15:34
字数 659
阅读 10
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

模型类

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32, default=None)
    create_time = models.DateTimeField()
    price = models.DecimalField(decimal_places=2, max_digits=8, default=None)
    publish_id = models.ForeignKey(to="Publish", on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Author')

    def __str__(self):
        return str(self.nid) + ':' + self.title


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32)


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    email = models.CharField(max_length=32)
    ad = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)


class AuthorDetail(models.Model):
    address = models.CharField(max_length=32)
    telephone = models.IntegerField()

批量插入

book_list = []
    for i in range(100):
        book = Book(title='book_%s' % i, price=i * i)
        book_list.append(book)
    Book.objects.bulk_create(book_list)

一对多和多对多 添加操作

# 一对多添加用户
publish = Publish.objects.get(nid=1)
Book.objects.create( 
  title='ubuntu',
  price=122, 
  create_time='2012-2-2', 
  publish_id=publish, 
  # publish_id_id=publish.nid  )
# 多对多添加用户
author01 = Author.objects.get(id="1") 
author02 = Author.objects.get(id="2")
 book = Book.objects.get(nid='2')
# book.authors.add(author01, author02)
# 多对多第二种 
book.authors.add(1, 2)
# 多对多第三种
book.authors.add(*[1, 2])
# 删除关联的作者
 book.authors.remove(author01)
# 删除所有关联的作者
 book.authors.clear() 
# 先删除所有在绑定
book.authors.set(1)

查询操作

基于对象的跨表查询(基于子查询)

# 一对多查询
    # 正查
    book = Book.objects.get(nid='1')
    # 取到关联的对象
    publish = book.publish_id
    print(publish.name)

    # 反查
    publish = Publish.objects.get(nid='1')
    books = publish.book_set.all()

    # 多对多查询
    book = Book.objects.get(nid='1')
    authors = book.authors.all()

    author = Author.objects.get(id='1')
    book = author.book_set.all()

    # 一对一
    author = Author.objects.get(id='1')
    ad = author.ad
    author_detail = AuthorDetail.objects.get(id='1')
    author = author_detail.author

# 基于双下划线的跨表查询(基于join实现的)
# KEY:正向查询按字段,反向查询按表明小写

# linux这本书的出版社名字
    # 正向
    name = Book.objects.filter(title='linux').values('publish_id__name')
    # 反向
    name = Publish.objects.filter(book__title='linux').values('name')

    # 查询第一个出版社对用的所有书
    # 正向
    book = Publish.objects.filter(nid='1').values('book__title')
    # 反向
    book = Book.objects.filter(publish_id_id='1').values('title')

    # 查询Linux这本书所有作者的手机号
    telephone = Book.objects.filter(title='linux').values('authors__ad__telephone')
    telephone = Author.objects.filter(book__title='linux').values('ad__telephone')

    # 查询id=1的出版社的作者的书籍和作者的名字
    title_name = Publish.objects.filter(nid='1').values('book__authors__name', 'book__title')
    title_name = Book.objects.filter(publish_id_id=1).values('title', 'authors__name')

    # 查询作者手机号的开头为110的书籍和出版社名称
    title_name = Author.objects.filter(ad__address__startswith='北京').values('book__title', 'book__publish_id__name')

# 聚合和分组

from django.db.models import Avg, Max, Sum, Min, Count
    avg = Book.objects.all().aggregate(price=Avg('price'))

    # 单表分组查询
    # 查询每个出版社id以及对应大的书籍个数
    count = Book.objects.values('publish_id').annotate(count=Count(1))

    # values中的值为分类的参数
    '''
        select Count(1) from Book GROUP by publish_id
    '''
    # 跨表分组查询
    # 查看每一个出版社名称以及对应的书籍个数
    count = Book.objects.values('publish_id__name').annotate(count=Count(1))
    count = Publish.objects.values('name').annotate(c=Count('book__nid'))
    # 查找作者大于一个的书籍对应的作者数
    query = Book.objects.annotate(c=Count('authors')).filter(c__gt=1).values('c', 'title')

 转载自:https://www.cnblogs.com/ls1997/p/10970583.html

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Django之模型层-多表操作

多表操作 数据库表关系 一对多:两个表之间的关系一旦确定为一对多,必须在数据多的表中创建关联字段 多对多:两个表之间的关系一定确定为多对多,必须创建第三张表(关联表) 一对一:一旦两...

osc_iqk0y05x
2018/12/13
2
0
Django 系列博客(十一)

Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面。 创建表 实例: 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,包含...

osc_iqk0y05x
2019/01/15
5
0
第二十篇ORM查询与SQL语句

ORM查询与SQL语句 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信...

osc_bj19pt0o
2018/05/06
2
0
Django-7 ORM多表操作

多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和...

osc_yz2rojzt
2019/04/25
2
0
Django中的表关系实现及操作

表关系的实现 预备知识 ORM的正向操作和反向操作: 1.正向操作:一个模型中定义了一个外键,通过该模型对该外键操作的操作叫做正向操作。 2.反向操作:被外键所关联的模型,通过该模型对外键...

osc_1v2pb1nt
2019/03/05
4
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊dubbo-go的AccessLogFilter

序 本文主要研究一下dubbo-go的AccessLogFilter AccessLogFilter dubbo-go-v1.4.2/filter/filter_impl/access_log_filter.go type AccessLogFilter struct {logChan chan AccessLogData}......

go4it
13分钟前
16
0
对服务与工厂感到困惑 - Confused about Service vs Factory

问题: As I understand it, when inside a factory I return an object that gets injected into a controller. 据我了解,当在工厂内部时,我返回一个被注入控制器的对象。 When inside a ...

技术盛宴
30分钟前
9
0
OpenCV开发笔记(六十七):红胖子8分钟带你深入了解特征点暴力匹配(图文并茂+浅显易懂+程序源码)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
59分钟前
24
0
将向量附加到向量[重复] - Appending a vector to a vector [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: Concatenating two std::vectors 22 answers 连接两个std :: vectors 22个答案 Assuming I have 2 standa......

javail
今天
19
0
获得所有文件夹的大小

有两个工具 https://www.getfoldersize.com/ http://www.uderzo.it/main_products/space_sniffer/index.html...

ethanleellj
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部