Я использую 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()