如何在 DRF 中使用带有 ArrayField 的 django filter_fields
How to use django filter_fields with ArrayField in DRF
我在模型中使用 Postgres ArrayField。我正在尝试使用 Django 过滤器,但出现错误。
AutoFilterSet 已解析字段 'flavor' 'exact' 查找无法识别的字段类型 ArrayField。尝试向 'Meta.filter_overrides' 添加覆盖。参见:https://django-filter.readthedocs.io/en/master/ref/filterset.html#customise-filter-generation-with-filter-overrides
型号
class Items(models.Model):
item = models.CharField(max_length=150, unique=True)
matches = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
category = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
flavor = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
special = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
created_at = models.DateTimeField(auto_now_add=True)
视图集
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Items.objects.all()
serializer_class = CategorySerializer
filter_fields = ('item', 'category')
好吧,我想通了,哈哈。需要使用 lookup_exp='icontains'.
创建自定义过滤器
class CategoryFilter(filters.FilterSet):
category = filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Items
fields = ('item', 'category')
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Items.objects.all()
serializer_class = CategorySerializer
filterset_class = CategoryFilter
别忘了
import django_filters as filters
因为您没有使用原来的名字。我还必须将字段更改为方括号。
fields = ['item', 'category']
我在模型中使用 Postgres ArrayField。我正在尝试使用 Django 过滤器,但出现错误。
AutoFilterSet 已解析字段 'flavor' 'exact' 查找无法识别的字段类型 ArrayField。尝试向 'Meta.filter_overrides' 添加覆盖。参见:https://django-filter.readthedocs.io/en/master/ref/filterset.html#customise-filter-generation-with-filter-overrides
型号
class Items(models.Model):
item = models.CharField(max_length=150, unique=True)
matches = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
category = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
flavor = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
special = ArrayField(models.CharField(
max_length=200), blank=True, default=list)
created_at = models.DateTimeField(auto_now_add=True)
视图集
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Items.objects.all()
serializer_class = CategorySerializer
filter_fields = ('item', 'category')
好吧,我想通了,哈哈。需要使用 lookup_exp='icontains'.
创建自定义过滤器class CategoryFilter(filters.FilterSet):
category = filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Items
fields = ('item', 'category')
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Items.objects.all()
serializer_class = CategorySerializer
filterset_class = CategoryFilter
别忘了
import django_filters as filters
因为您没有使用原来的名字。我还必须将字段更改为方括号。
fields = ['item', 'category']