DRF некорректное ограничение данных

Подскажите, почему все данные выводятся из TherdModel , хотя я ожидаю только ограниченное кол-во ?

models.py

class FirstModel(models.Model):
    mo_number = models.IntegerField(blank=False, null=False, unique=False)
    title = models.TextField(blank=True, null=True)
    cost = models.IntegerField(blank=True, null=True)

class SecondModel(models.Model):
    mod_first = models.ForeignKey(FirstModel, related_name='fir_second', blank=False, null=False, on_delete=models.DO_NOTHING)
    title = models.TextField(blank=True, null=True)
    cost = models.IntegerField(blank=True, null=True)

class TherdModel(models.Model):
    mod_second = models.ForeignKey(SecondModel, related_name='sec_therd', blank=False, null=False, on_delete=models.DO_NOTHING)
    title = models.TextField(blank=True, null=True)
    cost = models.IntegerField(blank=True, null=True)

serializers.py

class ListTherdSerializer(serializers.ModelSerializer):

    class Meta:
        model = TherdModel
        fields = ['mod_second','title','cost',]

class ListSecondSerializer(serializers.ModelSerializer):
    sec_fiveth = ListTherdSerializer(many=True, read_only=True)

    class Meta:
        model = SecondModel
        fields = ['mod_first','title','cost','sec_therd',]

class ListFirstSerializer(serializers.ModelSerializer):
    fir_second = ListSecondSerializer(many=True, read_only=True)

    class Meta:
        model = FirstModel
        fields = ['mo_number','title','cost','fir_second',]

view.py

class ListFirstView(generics.ListAPIView):
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]
    serializer_class = ListFirstSerializer

    def get_queryset(self):
        obj = FirstModel.objects.filter(fir_second__sec_therd__cost=35)
        return obj

Результат вывода

[
    {
        "mo_number": 3543,
        "title": "etretrerertrgfgcbcvb",
        "cost": 354435,
        "fir_second": [
            {
                "mod_first": 1,
                "title": "dhghjd,j,dud,mhmdhdmhmdhmdhmdt",
                "cost": 554,
                "sec_therd": [
                    {
                        "mod_second": 1,
                        "title": "jhrtjsyndgndgnstwste4r",
                        "cost": 3
                    },
                    {
                        "mod_second": 1,
                        "title": "41241241241241241241241241",
                        "cost": 35
                    },
                    {
                        "mod_second": 1,
                        "title": "2643tergastgwa ergws erg serg er er er erg er erg erg e",
                        "cost": 6243
                    }
                ],
            }
        ]
    }
]

Ожидаемый результат

[
    {
        "mo_number": 3543,
        "title": "etretrerertrgfgcbcvb",
        "cost": 354435,
        "fir_second": [
            {
                "mod_first": 1,
                "title": "dhghjd,j,dud,mhmdhdmhmdhmdhmdt",
                "cost": 554,
                "sec_therd": [
                    {
                        "mod_second": 1,
                        "title": "41241241241241241241241241",
                        "cost": 35
                    },
                    }
                ],
            }
        ]
    }
]

Ответы (2 шт):

Автор решения: Andrey Maslov

по сути ты фильтруешь

FirstModel.objects.filter(fir_second__sec_therd__cost=35)

т.е. находишь все объекты FirstModel, которые удовлетворяют условию, а потом для каждого из них через сериалайзер подтягиваешь все данные SecondModel и все данные TherdModel потому, что в сериалайзерах нет никаких ограничений на выдачу данных

→ Ссылка
Автор решения: Za Ars

Подскажите, а как ограничить данные для SecondModel и TherdModel ? Определить метод get_queryset в их сериалайзере ? –

Юзайте Prefetch с prefetch_related

    def get_queryset(self):
        obj = FirstModel.objects.filter(fir_second__sec_therd__cost=35).prefetch_related(
            Prefetch('fir_second', SecondModel.objects.filter(cost=35))
        )
        return obj

→ Ссылка