Как правильно фильтровать queryset между many-to-many полями используя django-filter?

Есть три модели:
class Car(models.Model):
     sub_types = models.ManyToManyField(SubType)

class SubType(models.Model):
     types = models.ManyToManyField(Type)

class Type(models.Model):
     pass


Необходимо фильтровать записи в модели Car используя django-rest-framework через get параметры, вот код который я написал:

class CarFilter(django_filters.FilterSet):
    type = django_filters.MethodFilter(action='type_filter')
    class Meta:
        model = Car
        fields = ['sub_type',  'type']

    def type_filter(self, queryset, value):
        sub_types = list(SubType.objects.filter(types__id=value).values_list('id', flat=True))
        cars = queryset.filter(sub_types__in=sub_types)
        return cars

class CarsList(generics.ListAPIView):
    renderer_classes = (renderers.JSONRenderer,)

    model = Car
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    filter_backends = (filters.DjangoFilterBackend, )
    filter_class = CarFilter


Интересует вот этот кусок кода:
sub_types = list(SubType.objects.filter(types__id=value).values_list('id', flat=True))
cars = queryset.filter(sub_types__in=sub_types)


Можно ли эту часть оптимизировать?
  • Вопрос задан
  • 3558 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы