Django Admin添加搜索栏报错:Related Field got invalid lookup: icontains
Django Admin搜索Dish模型时出现FieldError错误
错误信息
FieldError at /admin/menu/dish/ Related Field got invalid lookup: icontains Request Method: GET Request URL: http://www.lupita.restaurant/admin/menu/dish/?q=naranja Django Version: 4.0.6 Exception Type: FieldError Exception Value: Related Field got invalid lookup: icontains Exception Location: /usr/local/lib/python3.10/site-packages/django/db/models/sql/query.py, line 1262, in build_lookup
相关代码
models.py
class Dish(models.Model): name = models.CharField(max_length=50) nombre = models.CharField(max_length=50) description = models.TextField(max_length=500) descripcion = models.TextField(max_length=500) category = models.ForeignKey('Category', null=True, on_delete=models.SET_NULL) categoria = models.ForeignKey('Categoria', null=True, on_delete=models.SET_NULL) price = models.DecimalField(max_digits=5, decimal_places=2) image = models.ImageField(upload_to='dishes_img/', blank=True, null=True) tags = TaggableManager(blank=True) def __str__(self): return self.name class Meta: verbose_name = 'dish' verbose_name_plural = 'dishes' class Category(models.Model): category_name = models.CharField(max_length=50) slug = models.SlugField(blank=True, null=True) class Meta: verbose_name = ' category' verbose_name_plural = 'categories' def __str__(self): return self.category_name def save(self, *args, **kwargs): if not self.slug and self.category_name: self.slug = slugify(self.category_name) super(Category, self).save(*args, **kwargs) def get_absolute_url(self): return reverse('menu:view_menu_slug_en', args=[self.slug]) class Categoria(models.Model): nombre_categoria = models.CharField(max_length=50) slug = models.SlugField(blank=True, null=True) def __str__(self): return self.nombre_categoria def save(self, *args, **kwargs): if not self.slug and self.nombre_categoria: self.slug = slugify(self.nombre_categoria) super(Categoria, self).save(*args, **kwargs) def get_absolute_url(self): return reverse('menu:view_menu_slug_es', args=[self.slug])
admin.py
from django.contrib import admin from django.contrib.admin import AdminSite from .models import Dish, Categoria class MealsAdmin(admin.ModelAdmin): list_display = ['nombre', 'descripcion', 'categoria', 'price'] search_fields = ['nombre', 'descripcion'] list_filter = ['categoria'] admin.site.register(Dish, MealsAdmin) admin.site.register(Categoria) AdminSite.enable_nav_sidebar = False
解决方案
错误原因
该错误是由于尝试对关联字段(ForeignKey)直接使用icontains查找导致的。icontains是针对文本字段的查找方式,不能直接作用于关联对象本身。
修复步骤
检查并修正search_fields配置:
如果你需要搜索关联的Categoria分类名称,不能直接在search_fields中写categoria,需要通过双下划线指定关联模型中的具体文本字段:search_fields = ['nombre', 'descripcion', 'categoria__nombre_categoria']这样Django会对
Categoria模型的nombre_categoria字段执行icontains搜索,符合查找规则。重启服务器生效:
如果你的search_fields已经是['nombre', 'descripcion']仍报错,大概率是服务器缓存了旧的配置,需要重启Django进程(或uWSGI服务)让修改生效。
内容的提问来源于stack exchange,提问作者JFAA
相关产品推荐
相关产品推荐

