Meta.filter_overrides 对于 Django 过滤器视图中的 IntegerRangeField
Meta.filter_overrides for IntegerRangeField in django filter view
使用 Django 文档中的示例将 IntergerRangeField 与 Postgres 后端一起使用,以使用以下模型在 "ages" 中创建范围:
from django.contrib.postgres.fields import IntegerRangeField
from psycopg2.extras import NumericRange
from django.db import models
class Event(models.Model):
name = models.CharField(max_length=200)
ages = IntegerRangeField()
def __str__(self):
return self.name
然而,当使用 Django Rest Frameworks 并使用具有以下过滤器的过滤器视图时,这非常有效:
import django_filters
from django_filters import rest_framework as filters
from app import Event
class EventFilter(django_filters.FilterSet):
ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())
class Meta:
model = Event
fields = ['name','ages']
视图在 /api/event_filter/ 处生成断言错误,并建议向 Meta.filters_override 添加覆盖。
我真正想要的是一个基于此覆盖示例模型的示例,django-filters 文档 http://django-filter.readthedocs.io/en/latest/ref/filterset.html#filter-overrides 中的示例并没有帮助我理解如何让它呈现。如果能提供任何帮助,我将不胜感激,这样我就可以理解这个例子,以便将来利用它。
根据文档,覆盖自定义选项似乎是在 Meta
class 中完成的,而不是您完成的方式。
ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())
这里有一些潜在的问题:
- 声明本身似乎不受支持
- Meta class
似乎支持覆盖
queryset
不是 NumericRangeFilter
AFAIk 的有效选项
你可以尝试以下方法吗:
from django.contrib.postgres.fields import IntegerRangeField
class EventFilter(django_filters.FilterSet):
class Meta:
model = Event
fields = ['name','ages']
filter_overrides = {
IntegerRangeField: {
'filter_class': django_filters.NumericRangeFilter,
}
}
正在做类似的事情。
from django.contrib.postgres.fields import ArrayField
import django_filters
class SkillFilter(django_filters.Filters):
class Meta:
model = Skill
filter_overrides = {
ArrayField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
}
class SkillType(DjangoObjectType):
class Meta:
model = Skill
filterset_class = SkillFilter
interfaces = (relay.Node, )
然后是我的模型
from django.contrib.postgres.fields import ArrayField
from django.db import models
class Skill(models.Model):
name = models.CharField(max_length=50)
skills = ArrayField(models.CharField(max_length=200), blank=True)
这样做就解决了问题,希望您可以利用它来获得解决方案
注意:我认为 django_filters 不支持数组过滤器,这就是我使用 CharFilter
并且这对我有用的原因
使用 Django 文档中的示例将 IntergerRangeField 与 Postgres 后端一起使用,以使用以下模型在 "ages" 中创建范围:
from django.contrib.postgres.fields import IntegerRangeField
from psycopg2.extras import NumericRange
from django.db import models
class Event(models.Model):
name = models.CharField(max_length=200)
ages = IntegerRangeField()
def __str__(self):
return self.name
然而,当使用 Django Rest Frameworks 并使用具有以下过滤器的过滤器视图时,这非常有效:
import django_filters
from django_filters import rest_framework as filters
from app import Event
class EventFilter(django_filters.FilterSet):
ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())
class Meta:
model = Event
fields = ['name','ages']
视图在 /api/event_filter/ 处生成断言错误,并建议向 Meta.filters_override 添加覆盖。 我真正想要的是一个基于此覆盖示例模型的示例,django-filters 文档 http://django-filter.readthedocs.io/en/latest/ref/filterset.html#filter-overrides 中的示例并没有帮助我理解如何让它呈现。如果能提供任何帮助,我将不胜感激,这样我就可以理解这个例子,以便将来利用它。
根据文档,覆盖自定义选项似乎是在 Meta
class 中完成的,而不是您完成的方式。
ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())
这里有一些潜在的问题:
- 声明本身似乎不受支持
- Meta class 似乎支持覆盖
queryset
不是NumericRangeFilter
AFAIk 的有效选项
你可以尝试以下方法吗:
from django.contrib.postgres.fields import IntegerRangeField
class EventFilter(django_filters.FilterSet):
class Meta:
model = Event
fields = ['name','ages']
filter_overrides = {
IntegerRangeField: {
'filter_class': django_filters.NumericRangeFilter,
}
}
正在做类似的事情。
from django.contrib.postgres.fields import ArrayField
import django_filters
class SkillFilter(django_filters.Filters):
class Meta:
model = Skill
filter_overrides = {
ArrayField: {
'filter_class': django_filters.CharFilter,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
}
class SkillType(DjangoObjectType):
class Meta:
model = Skill
filterset_class = SkillFilter
interfaces = (relay.Node, )
然后是我的模型
from django.contrib.postgres.fields import ArrayField
from django.db import models
class Skill(models.Model):
name = models.CharField(max_length=50)
skills = ArrayField(models.CharField(max_length=200), blank=True)
这样做就解决了问题,希望您可以利用它来获得解决方案
注意:我认为 django_filters 不支持数组过滤器,这就是我使用 CharFilter
并且这对我有用的原因