Meta.filter_overrides для IntegerRangeField в представлении фильтра django - PullRequest
0 голосов
/ 25 апреля 2018

Использование примера в документации Django для использования IntergerRangeField с бэкэндом Postgres для создания диапазонов в «возрасте» со следующей моделью:

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']

представление генерирует AssertionError в / api / event_filter / и предлагает добавить переопределение к Meta.filters_override. Я был бы очень признателен за пример, основанный на примере модели для этого переопределения, пример из документации django-filters http://django -filter.readthedocs.io / en / latest / ref / filterset.html # filter-overrides , не помогает мне понять, как заставить это сделать. Я был бы признателен за любую помощь в этом, чтобы я мог понять с этим примером, чтобы использовать это в будущем.

1 Ответ

0 голосов
/ 25 апреля 2018

Судя по документации, переопределение пользовательской опции выполняется внутри класса Meta, а не так, как вы это сделали. ages = django_filters.NumericRangeFilter(queryset=Event.objects.all())

Здесь есть несколько потенциальных проблем:

  1. Сама декларация не поддерживается
  2. Кажется, что переопределения поддерживаются из мета-класса
  3. 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,
             }
        }  
...