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
相关产品推荐
相关产品推荐

