如何使 Django 注释在“用户”字段上使用 select_lated() ?

2024-01-04

我在用着Django 评论框架 https://docs.djangoproject.com/en/dev/ref/contrib/comments/。所有评论均由经过身份验证的用户发布。在评论附近,我使用显示一些用户个人资料信息{{ comment.user.get_profile }}

{# custom comment list templates #}
<dl id="comments">
  {% for comment in comment_list %}
    <dt id="c{{ comment.id }}">
        {{ comment.submit_date }} - {{ comment.user.get_profile.display_name }}
    </dt>
    <dd>
        <p>{{ comment.comment }}</p>
    </dd>
  {% endfor %}
</dl>

问题是django的评论查询不使用select_related()对于 100 条评论,我在数据库中得到了 101 条点击。

有没有一种方法可以让 django 评论框架一次性为每个评论选择用户配置文件?


我测试了使用默认值渲染对象的 100 条注释{% get_comment_list %}tag 和 django 做了 200 个评论相关的查询来列出评论+用户+个人资料,因为......

  1. Comment.__unicode__实际上打电话Comment.user if a user_id存在。 +1 查询
  2. get_profile+1 查询

Ouch!

我从大约 25 毫秒内的 203 个查询减少到大约 2 毫秒内的 3 个查询。

自己填充comment_list

I would 强烈建议建设comment_list QuerySet自己使用适当的select_related()来电。如果经常使用,请创建一个从其他视图调用的实用函数。

def get_comments_with_user_and_profile(obj):
    content_type =ContentType.objects.get_for_model(obj)
    return (Comment.objects
        .filter(content_type=content_type, object_pk=obj.id)
        .select_related('user__profile'))

如果您希望整个框架都以这种方式运行...您必须进行猴子修补。

这不是我会轻易做的事。还有其他方法可以解决这个特定问题,但您确实“一口气”问了。

把这个放在你的某个地方INSTALLED_APPS models.py文件。我其实有一个monkey_patch用于修改的应用程序django.contrib.auth.User.username长度等(这是与这里不同的最后手段)。

from django.contrib.comments.models import Comment
from django.contrib.comments.managers import CommentManager

class CommentManager(CommentManager):
    def get_query_set(self):
        return (super(CommentManager, self)
            .get_query_set()
            .select_related('user__profile'))
Comment.add_to_class('objects', CommentManager())

有关配置文件和 select_lated() 的问题

请注意,您的UserProfile类需要一个OneToOneField to User with a related_name等于你传递给的select_related()。在我的例子中是profile并且你需要 django 1.2+。我记得以前偶然发现过这一点。

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile') 
    # example to use User.objects.select_related('profile')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 Django 注释在“用户”字段上使用 select_lated() ? 的相关文章

  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • Django 的 request.FILES 出现 UnicodeDecodeError

    我在视图调用中有以下代码 def view request body u for filename f in request FILES items body body Filename filename n f read n 在某些情况下
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • Android复杂布局线性和相对

    I have to implement a layout like shown in the diagram and I do not know the best combination to achieve the required de
  • Django 基于类的视图上的 success_url 的反向抱怨循环导入

    当使用基于方法的视图时 重定向为reverse没有抱怨这一点 并且仍然可以找到 root url conf 但是 在基于阶级的观点中 它抱怨 ImproperlyConfigured at blog new post The include
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的
  • 在模板中添加浮点数(django)

    也许我遗漏了一些东西 但我想添加一个浮点数 如下所示 floatnumber add 3 4 过滤器添加我的结果 所以我不想写我的过滤器 但如果这是唯一的方法 我将复制添加过滤器 现在我正在这样做 def addf value arg Ad
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num
  • 性能:cakephp-mysql 中的 UUID 与自动递增

    我正在搜索 cakePHP 生成的 UUID 32 个字符长 是否比自动增量在性能上更快 插入和选择操作的比较 我应该使用 cakePHP 生成的 UUID 还是使用 MySQL 的简单自动增量生成的 UUID 这是我发现的一个案例研究 但
  • 如何重写 Django 中的 model.Manager.create() 方法?

    我有很多Hardware模型有一个HardwareType具有各种特征 就像这样 models py from django db import models class HardwareType model Models name mod
  • 计算元组中与模式匹配的元素

    我有一个矩阵m我想计算零的数量 m 2 0 2 2 4 4 5 4 0 9 4 8 2 2 0 0 我当前的代码如下 def zeroCount M return item for row in M for item in row coun
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • 记录 Google Cloud SQL PostgreSQL 实例上的慢速查询

    我工作的公司使用 Google Cloud SQL 来管理生产中的 SQL 数据库 我们遇到了性能问题 我认为查看 监控高于特定阈值 例如 250 毫秒 的所有查询是一个好主意 除其他外 通过查看PostgreSQL 文档 https ww
  • Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)

    一段时间以来 我在 Android 游戏中遇到了运动精灵间歇性 卡顿 的情况 这是一个非常简单的 2D OpenGL ES 2 0 游戏 这是一个持续存在的问题 我已经多次重新访问过 在我的游戏循环中 我有 2 个 计时器 一个用于记录前一
  • Django ImageField 默认值

    模型 py class UserProfile models Model photo models ImageField upload to get upload file name storage OverwriteStorage def
  • 如何从 Django 中的链接设置预定义的表单值?

    我的项目是这样布局的 1 page has many categories 2 category belongs to page has many items 3 item belongs to category 当我进入一个页面时 我想修
  • Django 多个外键,相同的相关名称

    我想创建一个模型 1 其中具有相同其他模型 2 的多个外键 我希望这些外键具有相同的related name因为每个外键将指向 model 2 的不同实例 因为我需要所有外键的一个反向关系 也许一个例子会更明确 class Parent M
  • django import-export 是否可以自定义预览模板?

    我的管理端将由非系统管理员人员使用 因此我希望它尽可能清晰 我不明白如何在确认导入之前自定义预览 要添加具有外键引用的对象 我只需查找匹配的 idbefore import函数并按照解释替换它here https stackoverflow
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信

随机推荐