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

Django搜索功能报错:FieldError: Related Field got invalid lookup: contains

问题解决:Django外键字段使用contains查找报错

错误根源

报错django.core.exceptions.FieldError: Related Field got invalid lookup: contains的核心问题在于:created_by和updated_by是外键字段,关联到系统用户模型(settings.AUTH_USER_MODEL),直接对整个外键对象用__contains做模糊查找是不允许的,必须指定外键关联模型的具体字符型字段(比如用户名、邮箱)来匹配。

另外你尝试的Q(owner_name__name__icontains=search_text)完全错误——owner_name本身就是CharField,根本不存在name子字段,直接用owner_name__icontains即可。

修复后的视图代码

修改filter中的外键查询部分,指定用户模型的具体字段(假设你的用户模型用username字段做匹配,若用邮箱则替换为email):

def owner_simple_search(request):
    search_text = request.GET.get('search_field', None)
    if search_text is None or search_text == "":
        context = {'owners': S_Owner_Master.objects.all()}
    else:
        qs = S_Owner_Master.objects.filter(
            Q(owner_name__icontains=search_text) |  # 用icontains忽略大小写,体验更友好
            Q(owner_email_id__icontains=search_text) |
            Q(owner_contact_number__icontains=search_text) |
            Q(owner_flat_number__icontains=search_text) |
            Q(flat_occupancy_status__icontains=search_text) |
            Q(occupied_by__icontains=search_text) |
            Q(deld_in_src_ind__icontains=search_text) |
            Q(created_by__username__icontains=search_text) |  # 关联User模型的username字段
            Q(updated_by__username__icontains=search_text)    # 同上
        )
        context = {
            'queryset': qs,
            'owners': S_Owner_Master.objects.all()
        }
    return render(request, "societyadmin/owners_list.html", context)

额外优化提示

  • 优先用__icontains替代__contains,实现大小写不敏感搜索,提升用户体验
  • 日期字段(比如owner_flat_registration_date)不能直接用contains,如果要支持搜索,可以通过annotate将日期转为字符串后匹配,或者改为日期范围搜索
  • 若搜索结果较多,建议给查询集加上分页,避免页面加载卡顿

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:15:54