model进阶(queryset,中介模型,查询优化,extra)

中介模型:

针对多对多关系,虽然可以自动创建关联表,但是需求是想要加入一些字段信息呢,这就需要自己手动建关联表了

对于这些情况,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型

models

 1 from django.db import models
 2
 3 class Person(models.Model):
 4     name = models.CharField(max_length=128)
 5
 6     def __str__(self):
 7         return self.name
 8
 9 class Group(models.Model):
10     name = models.CharField(max_length=128)
11     members = models.ManyToManyField(Person, through=‘Membership‘) # through 指定关系表
12
13     def __str__(self):
14         return self.name
15
16 class Membership(models.Model):
17     person = models.ForeignKey(Person) # 外键写上
18     group = models.ForeignKey(Group) # 外键写上
19     date_joined = models.DateField() # 需求添加的额外外键
20     invite_reason = models.CharField(max_length=64) # 需求添加的额外外键

注意事项:

 1     绑定关系的时候,与普通的多对多字段不同,你不能只创建 Person和 Group之间的关联关系,你还要指定 Membership模型中所需要的所有信息;而简单的add、create 和赋值语句是做不到这一点的。
 2     所以,你只实例化的时候,通过create来创建
 3     m2 = Membership.objects.create(person=paul, group=beatles,
 4         ...     date_joined=date(1960, 8, 1),
 5         ...     invite_reason="Wanted to form a band.")
 6
 7
 8 clear() 方法却是可用的。它可以清空某个实例所有的多对多关系:beatles.members.clear()
 9 # Note that this deletes the intermediate model instances
10 Membership.objects.all()
11 []

查询优化:select_related

select_related就是join表,当成了一个表的时候for循环每次循环只会是一次

 1 # 查询 主键等于2的文章的所属分类名称
 2 obj = ret=models.Article.objects.filter(nid=2) 一次
 3 for i in obj:
 4         i. category.title  # 每次打开2张表
 5
 6
 7 # ret=models.Article.objects.filter(nid=2).values("category__title") 一次数据库
 8 # print(ret)
 9
10
11 # select_related 就是join一张表,left inner join是一样的效果,以左边为主 right join,以右边为主
12 obj_list=models.Article.objects.select_related("user").select_related("category").all() # 可以join多章表,也可以写在一个里面,逗号隔开
13 for obj in obj_list: #
14     print(obj.category.title)。# 每次打开一张表

extra 函数

语法格式:

extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

有些情况下,Django的查询语法难以简单的表达复杂的 WHERE 子句,extra可以指定一个或多个 参数,例如 selectwhere or tables. 这些参数都不是必须的,但是你至少要使用一个!

 1 select:简单查询
 2 queryResult=models.Article.objects.extra(select={‘is_recent‘: "create_time > ‘2017-09-05‘"})
 3 结果集中每个 Entry 对象都有一个额外的属性is_recent, 它是一个布尔值,表示 Article对象的create_time 是否晚于2017-09-05.
 4
 5 article_obj=models.Article.objects
 6      .filter(nid=1)
 7      .extra(select{"standard_time":"strftime(‘%%Y%%m%%d‘,create_time)"}).values("standard_time","nid","title")
 8 print(article_obj)
 9     # <QuerySet [{‘title‘: ‘MongoDb 入门教程‘, ‘standard_time‘: ‘2017-09-03‘, ‘nid‘: 1}]>
10
11
12 参数之where / tables:简单条件查询
13 您可以使用tables手动将表添加到SQL FROM子句,where和tables都接受字符串列表
14 queryResult=models.Article.objects.extra(where=[‘nid in (1,3) OR title like "py%" ‘,‘nid>2‘])
15 ## table连接其它表
16 # SELECT * FROM myapp_book, myapp_person WHERE last = author_last
17 Book.objects.all().extra(table=[‘myapp_person‘], where=[‘last = author_last‘]) # 加from后面

原文地址:https://www.cnblogs.com/jokerbj/p/8161700.html

时间: 2024-07-29 23:00:14

model进阶(queryset,中介模型,查询优化,extra)的相关文章

Django-model进阶(中介模型,查询优化,extra,整体插入)

QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. ? 1 >>> Entry.objects.all()[:5]      # (LIMIT 5) >>> Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5) 不支持负的索引(例如Entry.objects.all()[-1]).通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询. 可迭代

中介模型,cbv视图,和查询优化

中介模型: 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了.但是,有时你可能需要关联数据到两个模型之间的关系上. 例如,有这样一个应用,它记录音乐家所属的音乐小组.我们可以用一个ManyToManyField 表示小组和成员之间的多对多关系.但是,有时你可能想知道更多成员关系的细节,比如成员是何时加入小组的. 对于这些情况,Django 允许你指定一个中介模型来定义多对多关系. 你可以将其他字段放在中介模型里面.源模型的

DAY19-Django之model进阶

QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Entry.objects.all()[:5] # (LIMIT 5) Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5) 不支持负的索引(例如Entry.objects.all()[-1]).通常,查询集 的切片返回一个新的查询集 -- 它不会执行查询. 可迭代 articleList=models.Ar

Django学习之model进阶

本节目录 一 QuerySet 二 中介模型 三 查询优化 四 extra 五 整体插入 六 xxx 七 xxx 八 xxx 一 QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Entry.objects.``all``()[:5] # (LIMIT 5) >>> Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5) 不支持负的索引(例如

Django 【第二十一篇】中介模型以及优化查询以及CBV模式

一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.CharField(max_length=64,verbose_name="文章标题") summary = models.CharField(max_length=244, verbose_name="文章概要") create_time = models.DateTimeF

Django框架学习-Model进阶用法

Model进阶用法 回顾 访问外键 访问多对多关系 更改数据库结构 当处理数据库结构改变时,需要注意到几点: 增加字段 首先在开发环境中: 再到产品环境中: 删除字段 删除多对多字段 删除model Manager管理器 给管理器添加新的方法 修改返回的QuerySet Model的方法 执行自定义SQL语句 Model进阶用法 回顾 Django中的model层主要和数据库进行交互,使用数据库API对数据库进行增删改查的操作. 下面将介绍关于model层更深入的用法. 下面是之前创建model

ORM中介模型 + auth模块

ORM中介模型 Django 允许你指定一个中介模型来定义多对多关系. 你可以将其他字段放在中介模型里面.源模型的ManyToManyField 字段将使用through 参数指向中介模型.对于上面的音乐小组的例子,代码如下: 注意:ManyToMany("Student",through="Course_students") ForeignKey("xxx") class student courst id name id name id na

Django框架 之 ORM中介模型

中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了.但是,有时你可能需要关联数据到两个模型之间的关系上. 例如,有这样一个应用,它记录音乐家所属的音乐小组.我们可以用一个ManyToManyField 表示小组和成员之间的多对多关系.但是,有时你可能想知道更多成员关系的细节,比如成员是何时加入小组的. 对于这些情况,Django 允许你指定一个中介模型来定义多对多关系. 你可以将其他字段放在中介模型里面.源模型的M

Orm之中介模型

什么是中介模型 中介模型针对的是ManyToMany(多对多)的时候第三张表的问题, 中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就不存在中介模型 中介模型示例 普通的ManyToMany示例 class Book(models.Model): title = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') class A