DjangoFilterBackend не фильтрует, когда используется __in с ListAPIView и один из фильтров пуст

Я использую DjangoFilterBackend для фильтрации некоторого ввода. URL написан на javascript. Это может быть что-то вроде этого: https://myApp/?se_ID__in=1,2&se_PR_ID__in=3

Дело в том, что не все фильтры всегда необходимы. Если все фильтры используются, то проблем нет. Но если какого-то из них нет в URL, то фильтр не работает, он ведет себя так, как будто этот неиспользуемый фильтр имеет нулевое значение вместо того, чтобы учитывать все возможные значения этого поля (пропустить фильтр).

Я делаю некоторые агрегации в конце представления, после фильтрации. Но, как я уже сказал, если один из возможных фильтров не используется, я получаю пустой JSON.

Вот мои файлы django:

serializers.py

class FiltroSerializer(serializers.Serializer):
    se_ID = serializers.CharField(required=False, default='all', help_text='Sender ID')
    se_PR_ID = serializers.CharField(required=False, default='all', help_text='Sender pr ID')
    rc_ID = serializers.CharField(required=False, default='all', help_text='Receiver ID')
    cr_PR_ID = serializers.CharField(required=False, default='all', help_text='Receiver pr ID')
    class Meta:
        model = Data

models.py

from django.utils.translation import gettext_lazy as _

class Data(models.Model):
    shSeCustomerName1 = models.CharField(max_length=300, verbose_name=_('shSeCustomerName1'))
    shRcCustomerName1 = models.CharField(max_length=300, verbose_name=_('shRcCustomerName1'))
    se_ID = models.CharField(max_length=300, verbose_name=_('SenderID'), blank=True, null=True)
    se_DESC = models.CharField(max_length=300, verbose_name=_('SenderDESC'), blank=True, null=True)
    se_PR_ID = models.CharField(max_length=300, verbose_name=_('SenderProcessID'), blank=True, null=True)
    se_PR_DESC = models.CharField(max_length=300, verbose_name=_('SenderProcessDESC'), blank=True, null=True)
    rc_ID = models.CharField(max_length=300, verbose_name=_('ReceiverID'), blank=True, null=True)
    rc_DESC = models.CharField(max_length=300, verbose_name=_('ReceiverDESC'), blank=True, null=True)
    rc_PR_ID = models.CharField(max_length=300, verbose_name=_('ReceiverProcessID'), blank=True, null=True)
    rc_PR_DESC = models.CharField(max_length=300, verbose_name=_('ReceiverPocessDESC'), blank=True, null=True)

    activityType = models.CharField(max_length=5, verbose_name=_('ActivityType'))

    requestedDeliveryDate = models.DateTimeField(auto_now_add=False, verbose_name=_('RequestedDeliveryDate'))
    sum = models.IntegerField(verbose_name=_('Sum'))

    class Meta:
        #ordering = ['pub_date']
        verbose_name_plural = 'Data_M10-M30'

    def __str__(self):
        return f'{self.sum}'

views.py

class FilterView(ListAPIView):
    queryset = Data.objects.all()
    serializer_class = FilterSerializer
    filter_backends = [DjangoFilterBackend]
    filter_fields = {
        'se_ID': ["in", "exact"],
        'rc_ID': ["in", "exact"],
        'se_PR_ID': ["in", "exact"],
        'rc_PR_ID': ["in", "exact"],}

    def get(self, request, **kwargs):
        queryset = self.get_queryset()
        filter_queryset = self.filter_queryset(queryset)
        return Response(filter_queryset.values('activityType').annotate(cajas=Sum('sum')).order_by())

Спасибо!

Вернуться на верх