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

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是针对文本字段的查找方式,不能直接作用于关联对象本身。

修复步骤

  1. 检查并修正search_fields配置:
    如果你需要搜索关联的Categoria分类名称,不能直接在search_fields中写categoria,需要通过双下划线指定关联模型中的具体文本字段:

    search_fields = ['nombre', 'descripcion', 'categoria__nombre_categoria']
    

    这样Django会对Categoria模型的nombre_categoria字段执行icontains搜索,符合查找规则。

  2. 重启服务器生效:
    如果你的search_fields已经是['nombre', 'descripcion']仍报错,大概率是服务器缓存了旧的配置,需要重启Django进程(或uWSGI服务)让修改生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:19