首页 > 解决方案 > django 过滤器视图中 IntegerRangeField 的 Meta.filter_overrides

问题描述

使用 Django 文档中的示例,使用带有 Postgres 后端的 IntergerRangeField 创建具有以下模型的“年龄”范围:

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/ 处生成一个 AssertionError,并建议向 Meta.filters_override 添加一个覆盖。我真正欣赏的是基于此覆盖示例模型的示例,django-filters 文档http://django-filter.readthedocs.io/en/latest/ref/filterset.html#filter-overrides中的示例,并没有帮助我理解如何让它渲染。我将不胜感激任何帮助,因此我可以通过这个示例理解以在将来使用它。

标签: djangodjango-rest-frameworkdjango-filter

解决方案


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

这里有几个潜在的问题:

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

您可以尝试以下方法:

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,
             }
        }  

推荐阅读