Django后台搜索外键字段报错:Related Field got invalid lookup: icontains
Django后台CourseTake模型搜索学生姓名报错的解决办法
问题
在Django后台给CourseTake模型的管理页面配置搜索框,想要搜索关联学生的姓名,但设置search_fields = ['student']后,触发搜索时出现错误:Related Field got invalid lookup: icontains。
报错原因
student是CourseTake模型的外键字段,直接将外键字段放入search_fields中,Django会尝试对整个Student模型实例使用icontains查找,但外键对象不支持这种查找方式,必须指定关联模型中的具体字符型字段(比如first_name、last_name)才能进行模糊搜索。
解决方法
在search_fields中使用**双下划线__**关联到Student模型的具体字段,格式为外键字段名__关联模型字段名,可以同时添加多个字段实现多维度搜索。
修改后的代码
admin.py
from django.contrib import admin import models @admin.register(models.Student) class StudentAdmin(admin.ModelAdmin): list_display = ['first_name', 'last_name', 'city'] @admin.register(models.CourseTake) class CourseTakeAdmin(admin.ModelAdmin): list_display = ['student', 'course', 'grade', 'performance'] list_editable = ['grade'] # 指定搜索学生的名和姓 search_fields = ['student__first_name', 'student__last_name'] # 修正方法参数:原参数名student会和外键字段名冲突,改为obj def student(self, obj): return obj.student.first_name
models.py(无需修改,仅作参考)
from django.db import models class Student(models.Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) date_adimitted = models.DateField(auto_now=True) address = models.CharField(max_length=255) city = models.CharField(max_length=255) state = models.CharField(max_length=255) def __str__(self) -> str: return f'{self.first_name} {self.last_name}' class CourseTake(models.Model): student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='coursetake') course = models.ForeignKey(Course, on_delete=models.CASCADE) grade = models.DecimalField(max_digits=5, decimal_places=2) class Meta: unique_together = [['student', 'course']] def __str__(self) -> str: return f'{self.student.first_name} {self.student.last_name}'
修改完成后,在后台搜索框输入学生的名或姓,就能匹配到对应的CourseTake记录了。
内容的提问来源于stack exchange,提问作者Alotab
相关产品推荐
相关产品推荐

