Задать вопрос
@Durilka96

Почему при наследовании от viewsets.ModelViewSet фильтрует, а при наследовании от APIView нет, как исправить?

есть два views один как тестовый использую(который от viewsets наследуется), и основной, который от APIViews наследуется. В тестовом views все работает как надо, а именно:
#views.py
class exam (viewsets.ModelViewSet):
    queryset = models.Country.objects.filter(id_country=0).prefetch_related(Prefetch("syn_position", queryset=models.SynPosition.objects.filter(id_position=1)))
    serializer_class = serializers.CountrySerializer
    filter_backends = [rest_filters.DjangoFilterBackend, ]
    filterset_class = filters.PositionFilter

#filters.py
class PositionFilter(filters.FilterSet):
    id_position = NumberFilter(field_name='syn_position__id_position', lookup_expr="exact")

    class Meta:
        model = models.Country
        fields = [
                    'syn_position__id_position',
        ]

#serializers.py
class CountrySerializer(serializers.ModelSerializer):
    syn_position = SynPositionSerializer(read_only=True, many=True)
    class Meta:
        model = models.Country
        fields = (
                'id_country',
                'short_name_country',
                'full_name_country',
                'abbr_name_country',
                'reg_short_name_country',
                'reg_full_name_country',
                'syn_position',
                )

#models.py
class Country (models.Model):
    id_country = models.IntegerField(primary_key=True)
    short_name_country = models.CharField(max_length=200, blank=True)
    full_name_country = models.CharField(max_length=200, blank=True)
    abbr_name_country = models.CharField(max_length=200, blank=True)
    reg_short_name_country = models.CharField(max_length=200, blank=True)
    reg_full_name_country = models.CharField(max_length=200, blank=True)
    syn_position = models.ManyToManyField('SynPosition')

    def __str__(self):
        return self.short_name_country

class SynPosition (models.Model):
    id_syn_position = models.AutoField(primary_key=True)
    id_position = models.ForeignKey('Position', on_delete=models.CASCADE, related_name='position')
    syn_position = models.CharField(max_length=200)
    reg_syn_position = models.CharField(max_length=200)

    def __str__(self):
        return self.syn_position

все выше перечисленное дает вот такой результат:
62b730642d4e6491017474.png
основной views не фильтрует и выдает в ответе вот такой результат, я думаю что скорее всего он фильтры PositionFilter не применяет, так как я их нигде не указал, где нужно их прописать правильно?
#основной views
class SearchView(APIView):
    def post(self, request, *args, **kwargs):
        result_search = main_search_service.search(
                                                        parameter_country=request.data['country_list'],
                                                        parameter_position=request.data['position_list'],
                                                        parameter_news_agency=request.data['news_agency_list'],
                                                        )
           
            return Response(status.HTTP_201_CREATED)
# функция search которая вызывается
def search(parameter_country, parameter_position, parameter_news_agency):
    search_face_list = list()
    for country in parameter_country:
        for position in parameter_position:
            reg_position_dict = Country.objects.values('syn_position__reg_syn_position').filter(short_name_country='Абхазия').prefetch_related(
                Prefetch("syn_position", queryset=SynPosition.objects.filter(id_position=0))
            )

Скриншот кода удалён модератором.
и в итоге выводит и премьер-министра и президента, хотя должен выводить только одного, как на скриншоте выше.
где нужно прописать это все правильно?
  • Вопрос задан
  • 103 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

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

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