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())
Спасибо!