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

