使用Django文档中的示例,将IntergerRangeField与Postgres后端一起使用,以便在" age"中创建范围。使用以下模型:
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框架并使用带有以下过滤器的过滤器视图时,这非常有效:
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 /处生成AssertionError,并建议向Meta.filters_override添加覆盖。 我真的很感激的是一个基于此覆盖的示例模型的示例,django-filters文档http://django-filter.readthedocs.io/en/latest/ref/filterset.html#filter-overrides中的示例,并不能帮助我理解如何渲染它。我将不胜感激任何帮助,所以我可以通过这个例子来理解将来利用它。
答案 0 :(得分:0)
根据文档,覆盖自定义选项似乎是在Meta
类中完成的,而不是你已经完成的方式。
ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())
这里有一些潜在的问题:
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,
}
}
答案 1 :(得分:0)
做类似的事情。
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
并且对我有用的原因