есть два 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
все выше перечисленное дает вот такой результат:
основной 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))
)
Скриншот кода удалён модератором.
и в итоге выводит и премьер-министра и президента, хотя должен выводить только одного, как на скриншоте выше.
где нужно прописать это все правильно?