首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

减少Django ManyToMany TabularAdminInline中的Postgresql查询

在Django中,ManyToMany关系是通过中间表来实现的。在使用TabularAdminInline时,如果ManyToMany字段的查询次数过多,可能会导致性能问题。为了减少这种查询,可以采取以下几种方法:

  1. 使用select_related()方法:在查询ManyToMany字段时,使用select_related()方法可以一次性将相关的对象一起查询出来,减少数据库查询次数。例如:
代码语言:txt
复制
class MyModelAdmin(admin.TabularInline):
    model = MyModel
    extra = 1

    def get_queryset(self, request):
        return super().get_queryset(request).select_related('many_to_many_field')
  1. 使用prefetch_related()方法:如果ManyToMany字段的查询结果需要在模板中进行迭代,可以使用prefetch_related()方法来预先加载相关的对象,减少查询次数。例如:
代码语言:txt
复制
class MyModelAdmin(admin.TabularInline):
    model = MyModel
    extra = 1

    def get_queryset(self, request):
        return super().get_queryset(request).prefetch_related('many_to_many_field')
  1. 使用缓存:如果ManyToMany字段的查询结果在一段时间内不会发生变化,可以考虑使用缓存来减少数据库查询次数。可以使用Django内置的缓存框架或者第三方库来实现。例如:
代码语言:txt
复制
from django.core.cache import cache

def get_many_to_many_objects():
    objects = cache.get('many_to_many_objects')
    if objects is None:
        objects = ManyToManyModel.objects.all()
        cache.set('many_to_many_objects', objects, 3600)  # 缓存一小时
    return objects

以上是减少Django ManyToMany TabularAdminInline中的Postgresql查询的一些方法。根据具体的业务需求和数据量大小,可以选择适合的方法来优化查询性能。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云数据库 PostgreSQL:https://cloud.tencent.com/product/postgres
  • 腾讯云缓存 Redis:https://cloud.tencent.com/product/redis
  • 腾讯云云服务器 CVM:https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务 TKE:https://cloud.tencent.com/product/tke
  • 腾讯云CDN加速:https://cloud.tencent.com/product/cdn
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PostgreSQL查询简介

我们还将使用PostgreSQL数据库一些示例数据来练习SQL查询。...PostgreSQL,通常缩写为“Postgres”,是一种具有面向对象方法关系数据库管理系统,这意味着信息可以表示为PostgreSQL模式对象或类。...有关设置帮助,请按照我们指南“ 如何在Ubuntu 18.04上安装和使用PostgreSQL“安装PostgreSQL”部分进行操作。 有了这个设置,我们就可以开始教程了。...您可以通过将其记录在PostgreSQL数据库来决定练习数据库技能,而不是将此信息保存在物理分类帐。...想要了解更多关于PostgreSQL查询简介相关教程,请前往腾讯云+社区学习更多知识。 ---- 参考文献:《An Introduction to Queries in PostgreSQL

12.3K52

PostgreSQL查询:1.查询执行阶段

PostgreSQL查询:1.查询执行阶段 开始关于PG内部执行机制文章系列。这一篇侧重于查询计划和执行机制。...PG源码“range table”指表、子查询、连接结果--也就是说SQL语句操作任何记录集。 语法分析器。语法分析器确定数据库是否存在查询引用表和其他对象,用户是否有访问这些对象权限。...其中之一是将解析树视图名替换为该视图查询相对应子树。...这里有2个优趣点需要注意: 1) 其中一个初始化表从执行计划树消失了,因为执行计划器指出查询处理不需要它 2) 估算要处理行数和每个节点处理代价 计划查询。...下面是此查询解析树: 在这个查询,规划器将考虑所有可能连接顺序。在下一个示例,一些连接由JOIN子句显式定义: SELECT ...

3K20

Django学习笔记之Queryset详解

注意:这里只是查询Entry表,返回a每条记录只包含Entry表字段值,不管Entrymodel是否有onetoone、onetomany、manytomany字段,都不会关联查询。...OneToOne关系也是这样关联查询,可以看到,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联查询提供了相同方式,真是牛逼啊。...可以使用双下划线对OneToOne、OneToMany、ManyToMany进行关联查询和反向关联查询,方法与filter()使用方法相同。...聚合函数可以像filter那样关联表,即在聚合函数Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联提供了相同方式,见下面例子。...代码2,当遍历开始前,先拿到EntryQuerySet,并且也拿到这个QuerySet每个objectblog对象,这样遍历过程,就不用再查询数据库了,这样就减少了数据库读次数。

2.7K30

探索 PythonDjango 支持分布式多租户数据库,如 Postgres+Citus

在 Citus 中分发数据 将 Django 应用程序更新为范围查询 使用中间件自动化 更多 在 确定分布策略 ,我们讨论了在多租户用例中使用 Citus 所需与框架无关数据库更改。...1.2 在属于一个帐户每个 ManyToMany 模型上为 account_id 引入一个列 目标与之前相同。我们希望能够将 ORM 调用和查询路由到一个帐户。...在 settings.py ,将数据库引擎改为 django-multitenant 提供自定义引擎: 'ENGINE': 'django_multitenant.backends.postgresql...,我们介绍了在 citus ManyToMany 关系需要一个带有租户列 through 模型。...将 Django 应用程序更新为范围查询 上一节讨论 django-multitenant 库不仅对迁移有用,而且对简化应用程序查询也很有用。该库允许应用程序代码轻松地将查询范围限定为单个租户。

2K10

django 1.8 官方文档翻译: 2-5-6 多数据库

若要这样做,你必须为你所有的应用模型建立DATABASE_ROUTERS,包括正在使用contrib 应用和第三方应用,以使得不会有查询被路由到默认数据库。...默认路由模式还确保如果没有指明数据库,所有的查询都回归到default数据库。 你不需要做任何事情来激活默认路由模式 —— 它在每个Django项目上’直接‘提供。...路由查询将按照DATABASE_ROUTERS设置列出顺序进行。...在这个例子,AuthRouter在PrimaryReplicaRouter之前处理,因此auth模型查询处理在其它模型之前。...PrimaryReplicaRouter 实现捕获所有的查询,这意味着所有的模型可以位于所有的数据库

1.5K20

Django ORM 查询某列字段值方法

根据对象操作转换成SQL语句,根据查询结果转化成对象, 在映射过程中有性能损失....下面看下Django ORM 查询某列字段值,详情如下: 场景: 有一个表某一列,你需要获取到这一列所有值,你怎么操作?...QuerySet,但是内容是元祖形式查询值。...查看高阶用法,告诉你怎么获取一个值list,如: [‘测试feed’, ‘今天’, ‘第三个日程测试’, ‘第四个日程测试’, ‘第五个测试日程’] 到此这篇关于Django ORM 查询某列字段值文章就介绍到这了...,更多相关django orm 字段值内容请搜索ZaLou.Cn以前文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

11.7K10

PostgreSQL查询当前执行SQL执行计划——pg_show_plans

generic plan是指对于preapre语句生成计划,该计划策略会在执行execute语句时候把参数bind到plan,然后执行计划。...但是explain查询当前缓存执行计划,在实际估算成本可能是不准确,因为很可能估算成本和实际运行成本不一致。...pg_show_plans模块 接下来主题则是一个供PostgreSQL数据库查询正在进行SQL执行计划模块——pg_show_plans,它可以动态查找当前正在进行SQL执行计划。...此模块支持从9.5到12PostgreSQL版本。它会在共享内存上创建一个哈希表,以便临时存储查询计划。哈希表大小不能更改,因此如果哈希表已满,则不会存储计划。...通过pg_show_plans和pg_stat_activity联合查询出当前正在进行SQL执行计划。

2.6K40

django 博客使用 annotate 统计分类下文章数量

django查询某篇 post 对应分类时,比如 post 1,首先查询到它分类 id 为 1,然后 django 再去 Category 表找到 id 为 1 那一行,这一行就是 post...反过来,如果要查询 category 1 对应全部文章呢?...category 1 在 Category 表对应 id 是 1,django 就在 Post 表搜索哪些行 category_id 为 1,发现前 3 行都是,把这些行取出来就是 category...同理,这里 annotate 做事情就是把全部 Category 取出来,然后去 Post 查询每一个 Category 对应文章,查询完成后做一个聚合,统计每个 Category 有多少篇文章,...此外,annotate 方法不局限于用于本文提到统计分类下文章数,你也可以举一反三,只要是两个 model 类通过 ForeignKey 或者 ManyToMany 关联起来,那么就可以使用 annotate

2.1K70

django select_related和prefetch_related用法与区别

这些技巧和方法都是为了减少对数据库访问次数和对内存占用,从而提升网站性能。...,如下图所示: 言归正传 假设我们有如下一个文章(Article)模型,其与类别(Category)是单对多地关系(ForeignKey), 与标签(Tag)是多对多关系(ManyToMany)。...当我们在模板调用{{ article.category.name }} 和 {{ tag.name }}显示category和tags名字时,Django还需要重新查询blog_category和blog_tag...现在我们对article_list视图函数稍微进行修改,加入select_related方法,在查询文章列表时同时一次性获取相关联category对象信息,这样在模板调用 {{ article.category.name...查询次数减少到5次,运行时间1ms,是不是很帅?

1.3K20

django-搭建BBS关键点总结

0826自我总结 django-搭建BBS关键点总结 一.关于开口子,直接输入url访问文件内容 django自带开了个口子是static文件可以直接访问到 手动开口子 urs.py from django.views.static... 注意点:如果同时在一个浏览器打开两个相同网页,他code以后那个网站为准,这是session特性 三.验证码生成 https://www.cnblogs.com/pythonywy/p/...) 也可以在网页完成是否登入判断 {% if request.user.is_authenticated %} 完成注销操作 auth.logout(request) 五.表单查找 #查询当前站点下所有标签对应文章数...#查询当前站点下所有分类对应文章数 # 查询所有分类对应文章数 # 分组查询固定规则: # filter 在annotate前表示where条件 # values 在annotate前表示group...annotate(字段名称=聚会函数) annotate 前面有values时候,主要是加快查询速度,values必须要有annotate依据 六.自定义文件夹存储路径 settings.py

56420

Postgresql 查询特异功能 与 开发人员“大爱”(感谢腾讯自媒体)

(Sorry 个人名字属于隐私,不便透露) 正文: 本来上次是写过这个PostgreSQL 功能,但上次在一个论坛里面发现其实大家对这个功能认识上是有误区,所示这次是的详细一次文字。...功能很简单就是模糊查询,类似 select * from table where column1 like ‘%PG牛逼%’;然后走一个靠谱索引查询,ORACLE 打死他都不行,当然可以走全文索引...pg_trgm本身是不包含在PostgreSQL 源码安装,当然是插件方式安装,安装上是很简单,具体请百度(弄湿了我可不管) 进入到你数据库,create extension pg_trgm...10万条 下面我们创建索引了,创建GIN 索引 创建索引系统报错,这是由于还没有创建相关扩展 添加了这些扩展后我们就可以建立相关索引 我们可以看到查询已经走了索引,并且查询时间1ms 那如果我们没有这个索引会怎么样...OK 如果已经体会到了PG 在模糊查询厉害之处,群里有人问第二个问题是 GIN VS GIST 那种索引更好 这也是一个热门问题?

76520

Django 之 Models(Models 模型 & 数据表关系)

: 把面向对象思想转换成关系数据库思想,操作上把类等价于表格 类对应表格 类属性对应表字段 在应用models.py 文件定义class 所有需要使用ORMclass都必须是 models.Model...子类 class 所有属性对应表格字段 字段类型都必须使用 modles.xxx 不能使用python类型 在django,Models 负责跟数据库交互 django连接数据库 自带默认数据库...查询命令 - 类名.objects.all() 查询数据表所有内容,返回结果是一个 QuerySet 类型,实际上是类列表中装这个一个一个数据对象 - 类名.objects.filter...(条件) 查找数据 # from 应用名.models import 类名 from myapp.models import Student # 查询Student表所有数据,得到是一个QuerySet...表示任意一个表数据可以拥有对方表格多项数据,反之亦然 比如典型例子就是老师和学生关系 使用上,在任意一方,使用ManyToMany定义,只需要定义一边add 添加老师,则在student.teachers.add

2.3K87

程序员硬核“年终大扫除”,清理了数据库 70GB 空间

对于每个索引值,B树索引将在其叶同时保留值和指向行指针(TID)。索引值越大,索引越大。PostgreSQL 12 当索引包含许多重复值时,这些重复值将存储在索引叶。如此一来,将占用很多空间。...清理表:PostgreSQL 提供 VACUUM FULL 命令回收表死元组占用空间方法(https://www.postgresql.org/docs/current/sql-vacuum.html...排除空值部分索引小于5MB,减少了该指标的 99% 以上! 为了确保不需要这些 NULL 值,我们重置了表上统计信息,等了一段时间后,我们发现索引使用就像旧索引一样!...为了找到他们,我们写了一个查询来搜索具有high字段索引null_frac,PostgreSQL估计列值百分比为NULL: -- Find indexed columns with high null_frac...由于没删除完整索引,因此查询仍可以使用它们,在这个过程不影响性能。在Django迁移同时创建索引,我们建议最好手动进行。

2.2K10

解决django框架model中外键不落实到数据库问题

在外键字段参数添加db_constraint=False即可,数据库没有外键关系,代码依然可以按照正常外键方式使用。...不通过外键查询多对多数据,数据库表设计不使用外键 终于解决了 如何没有通过外键查询多对多数据,多对一数据 意义: 使用外键,高并发程序中会产生锁表,影响性能。...model 定义,无外键 # -*- coding:UTF-8 -*- from django.db import models #导入django自带User模型进行扩展 from django.contrib.auth.models...数组) :思路:先通过当前用户,查询用户角色关系表,获得全部角色id,再通过角色id获得角色名 """ user = obj role_ids = UserRole.objects.filter...以上这篇解决django框架model中外键不落实到数据库问题就是小编分享给大家全部内容了,希望能给大家一个参考。

1.3K10

Django JSONField SQL注入漏洞(CVE-2019-14234)分析与影响

0x01 什么是JSONField Django是一个大而全Web框架,其支持很多数据库引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但与Django天生为一对儿数据库莫过于...Postgresql了,Django官方也建议配合Postgresql一起使用。...在Django也支持了Postgresql数据类型: JSONField ArrayField HStoreField 这三种数据类型因为都是非标量,且都能用JSON来表示,我下文就用JSONField...根据上面的分析可知,transform是生成SQL查询“键名”部分,那么如果我们控制了queryset查询键名,即可注入任意SQL语句了。...原因是,Django-Admin中就支持用户控制queryset查询键名,我在2017年在微博说到过这一点,不过当时没有测过JSONField,sad。 ?

2K32
领券