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

Django外键关联双表查询:输入Person_ID无法返回Person表数据问题

问题修复方案

核心问题说明

  • 当前SearchResultsView指定的model为Person,但get_queryset返回的是Report模型的查询集,配置不匹配
  • Django ORM支持正向外键直接访问关联对象数据,添加select_related预加载可避免N+1次数据库查询,提升性能

1. 视图代码(view.py)修改

from django.db.models import Q
from django.views.generic import TemplateView, ListView
from .models import Person, Report

class HomePageView(TemplateView):
    template_name = 'home.html'

class SearchResultsView(ListView):
    # 修正model配置,与返回的查询集类型匹配
    model = Report
    template_name = 'search_results.html'
    # 自定义模板上下文变量名,语义更清晰
    context_object_name = 'report_list'

    def get_queryset(self):
        query = self.request.GET.get('q', '')
        # 预加载关联的Person数据,一次性查询两张表的所需内容
        object_list = Report.objects.select_related('person').filter(
            Q(person__Person_ID__icontains=query)
        )
        return object_list

2. 模板(search_results.html)字段调用示例

可直接通过外键属性获取Person表的对应字段:

{% for report in report_list %}
<div class="result-item">
    <p>Report_ID:{{ report.Report_ID }}</p>
    <p>file_ID:{{ report.file_ID }}</p>
    <p>Person_ID:{{ report.person.Person_ID }}</p>
    <p>姓名:{{ report.person.name }}</p>
</div>
{% empty %}
<p>未找到匹配的查询结果</p>
{% endfor %}

3. 可选:后台Report列表展示关联字段

如果需要在Django admin后台的Report列表页也展示Person表字段,修改admin.py:

from django.contrib import admin
from .models import Person, Report

class ReportAdmin(admin.ModelAdmin):
    list_display = ("Report_ID", "file_ID", "get_person_id", "get_person_name")

    def get_person_id(self, obj):
        return obj.person.Person_ID
    get_person_id.short_description = 'Person_ID'

    def get_person_name(self, obj):
        return obj.person.name
    get_person_name.short_description = '姓名'

admin.site.register(Report, ReportAdmin)
admin.site.register(Person)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:48:02