在django过滤器视图中,IntegerRangeField的Meta.filter_overrides

时间:2018-04-25 05:34:04

标签: django django-rest-framework django-filter

使用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中的示例,并不能帮助我理解如何渲染它。我将不胜感激任何帮助,所以我可以通过这个例子来理解将来利用它。

2 个答案:

答案 0 :(得分:0)

根据文档,覆盖自定义选项似乎是在Meta类中完成的,而不是你已经完成的方式。 ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())

这里有一些潜在的问题:

  1. 声明本身似乎不受支持
  2. 在Meta类
  3. 中似乎支持覆盖
  4. queryset不是NumericRangeFilter AFAIk
  5. 的有效选项

    您可以尝试以下方法:

    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并且对我有用的原因