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

Django Crispy Filter筛选报错:IntegerField不支持'kategorie'查询的解决

问题描述

使用Django结合django-filter对Data数据表按类别筛选时,出现FieldError:

Django FieldError: Unsupported lookup 'kategorie' for IntegerField or join on the field not permitted

当前filters.py中的筛选字段定义:

kategorie = django_filters.CharFilter(label="Kategorie", field_name="ucet__cislo__kategorie__jmeno", lookup_expr='icontains')

模型结构(models.py):

class Data(models.Model):
    ucet = models.ForeignKey(Ucty, on_delete=models.CASCADE, null=True, blank=True)

class Ucty(models.Model):
    cislo = models.IntegerField("Účet", blank=True, null=True)

class Mustek(models.Model):
    ucet = models.ForeignKey(Ucty, on_delete=models.CASCADE)
    kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE)

class Kategorie(models.Model):
    jmeno = models.CharField("Kategorie", max_length=20, blank=True, null=True)
解决方案

错误原因

你定义的field_name="ucet__cislo__kategorie__jmeno"路径有误:cislo是Ucty模型的IntegerField(普通整数字段),不是关联其他模型的外键,无法通过它继续链式查询kategorie属性,这直接导致了FieldError。

修正步骤

根据你的模型关联关系,正确的查询路径应为:Data → Ucty → Mustek(反向关联)→ Kategorie → jmeno,有两种修正方式:

方式1:使用默认反向关联名称

直接修改filters.py中的字段定义,使用Django默认的反向关联名称(模型名小写+_set):

kategorie = django_filters.CharFilter(label="Kategorie", field_name="ucet__mustek_set__kategorie__jmeno", lookup_expr='icontains')

方式2:自定义反向关联名称(推荐,路径更直观)

先修改models.py中Mustek模型的外键字段,添加related_name:

class Mustek(models.Model):
    # 添加related_name='musteks'自定义反向关联名称
    ucet = models.ForeignKey(Ucty, on_delete=models.CASCADE, related_name='musteks')
    kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE)

再修改filters.py中的字段定义:

kategorie = django_filters.CharFilter(label="Kategorie", field_name="ucet__musteks__kategorie__jmeno", lookup_expr='icontains')

两种方式都能让django-filter正确识别关联路径,实现按类别名称筛选Data数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:20:34