Nano Hash - криптовалюты, майнинг, программирование

Django Rest Framework + django_filter: фильтровать по имени или нет, если ничего не указано

Я использую Django rest Framework вместе с django_filters. (Я попытался максимально упростить/уменьшить код здесь)

Как я могу заставить django_filters фильтровать по ограничениям__name=None (или ограничениям=None), если в запросе не указано ограничение?

Допустим, у меня есть эта модель:

class Resource(models.Model):
    constraints = models.ManyToManyField(Feature, related_name='constraint+', blank=True)

class Feature(models.Model):
    name = models.CharField(max_length=255, blank=False, unique=True)

И это представление и фильтр:

class ResourceFilter(FilterSet):
    constraints = django_filters.CharFilter(name='constraints__name')

    class Meta:
        model = Resource
        fields = ['constraints']


class ResourceViewSet(viewsets.ModelViewSet):
    serializer_class = ResourceSerializer
    filter_class = ResourceFilter
    filter_backends = (filters.DjangoFilterBackend,)

/api/resource/?constraints=testconstraint работает нормально, но я хочу, чтобы /api/resource/ возвращал только ресурсы, не имеющие ограничений.

Я могу уменьшить набор запросов, но мне кажется, что что-то может решить django_filters. Это?:

def get_queryset(self):
    if 'constraints' not in self.request.query_params:
        return Resource.objects.filter(constraints=None)
    else:
        return Resource.objects.all()

Ответы:


1

Вы можете переопределить свойство qs в подклассе FilterSet, где вы можете управлять отфильтрованным запросом и получать доступ к объекту запроса:

Попробуйте с этим:

class ResourceFilter(FilterSet):

    constraints = django_filters.CharFilter(name='constraints__name')

    class Meta:
        model = Resource
        fields = ['constraints']

    @property
    def qs(self):
        parent_qs = super(ResourceFilter, self).qs
        if 'constraints' in self.request.query_params:
            return parent_qs
        else:
            return parent_qs.filter(constraints=None)
18.11.2016

2

Подкласс CharFilter переопределяет filter:

class OrNoneCharFilter(CharFilter):   
    def filter(self, qs, value):
       if value is None: 
           return qs.filter(constraints=None)

       return super().filter(qs, value)   
18.11.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..