You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django ORM如何从User模型正确提取指定字段到HTML模板?

解决方案:优化Django查询并正确渲染关联字段

问题根源

当你使用values()时,Django返回的是字典组成的QuerySet,而非模型实例。字典里不存在author这个关联对象属性,自然无法通过post.author.first_name访问值——你需要直接访问字典中用双下划线定义的键名。

而如果想保持模型实例的访问方式(即post.author.first_name),同时只加载所需字段,应该用only()替代values()。


方案1:用only()保持模型实例访问(推荐)

only()会返回模型实例,但仅预加载你指定的字段,配合select_related()可以一次性拉取关联的User表字段,避免额外查询,同时内存占用和values()相当。

视图代码

from django.shortcuts import render
from .models import Post

def post_list(request):
    # 仅加载Post的pub_date,以及关联User的first_name
    posts = Post.objects.select_related('author').only('pub_date', 'author__first_name')
    return render(request, 'post_list.html', {'posts': posts})

模板代码(无需修改)

{% for post in posts %}
    <div>
        <p>作者:{{ post.author.first_name }}</p>
        <p>发布日期:{{ post.pub_date }}</p>
    </div>
{% endfor %}

方案2:调整values()的字段定义

如果你坚持使用values(),需要在字段中明确指定关联模型的字段(用双下划线连接),然后在模板中直接访问对应的键名。

视图代码

from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.select_related('author').values('pub_date', 'author__first_name')
    return render(request, 'post_list.html', {'posts': posts})

模板代码(需修改访问方式)

{% for post in posts %}
    <div>
        <p>作者:{{ post.author__first_name }}</p>
        <p>发布日期:{{ post.pub_date }}</p>
    </div>
{% endfor %}

补充说明

  • select_related()在这里是必须的,它会把Post和User的查询合并为一次JOIN查询,避免N+1问题。
  • only()和values()都能减少内存占用,区别在于返回的数据类型:前者是模型实例,后者是字典。根据你的模板访问习惯选择即可。

内容的提问来源于stack exchange,提问作者hoshide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:35:36