【问题标题】:Django-Filter "contains" on related fieldDjango-Filter“包含”相关领域
【发布时间】:2023-05-19 00:46:02
【问题描述】:

我有两个通过外键链接的简单模型:

models.py:
class Operator(models.Model):
    operator = models.CharField(max_length=50, primary_key=True, verbose_name='Operator')
    operator_name = models.CharField(max_length=100, verbose_name='Operator Name', blank=False, null=False)

class SubOperator(models.Model):
    operator = models.ForeignKey(Operator, on_delete=models.CASCADE)
    sub_operator = models.CharField(max_length=50, verbose_name='Sub Operator')
    sub_operator_name = models.CharField(max_length=100)
    start_date = models.DateField(blank=False, null=False, verbose_name='Start Date')
    end_date = models.DateField(blank=False, null=False, verbose_name='End Date')

用户应该能够在 Django-Filter 模块中选择带有“like”的运算符,该运算符转换为“lookup_expr='contains'”,但不幸的是我得到了以下异常: “django.core.exceptions.FieldError:相关字段查找无效:​​包含”

filters.py:
operator = django_filters.CharFilter(field_name='operator', lookup_expr='contains', label='Operator')

【问题讨论】:

    标签: django django-filter


    【解决方案1】:

    将您的 field_name 参数更改为 operator__operator_name 而不是 operator

    operator = django_filters.CharFilter(
        field_name='operator__operator_name',
        lookup_expr='contains',
        label='Operator'
    )

    【讨论】:

      【解决方案2】:

      刚刚找到解决方案(从我的角度来看,文档对如何正确编写查找表达式有点误导,但也许只有我一个人^^)

      正确的写法是:

      operator = django_filters.CharFilter(field_name='operator', lookup_expr='operator__contains', label='Operator')
      

      所以或多或少如果您使用标准过滤器对象并检查它为您提供的字段选项,这就是您可以放入 django 过滤器的 lookup_expr 的内容!

      【讨论】: