Как исключить поля, находящиеся на одном уровне глубины с помощью DRF?

как исключить поля, находящиеся на одном уровне глубины в django rest framework?
Я хочу удалить поле id в testPieces и resultTestsList.

вот мой API:

enter image description here

мой сериализатор:

class Test_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Test_1
        exclude = ["id"]
        depth = 3

мои модели:

class Test_pieces_1_question(models.Model):
    question = models.CharField(max_length=3000)
    yesScore = models.IntegerField()
    noScore = models.IntegerField()
    
class Result_tests_list_1(models.Model):
    text = models.CharField(max_length=3000)
    score = models.IntegerField()
    unicode = models.CharField(max_length=500)

class Test_1(models.Model):    
    name = models.TextField(max_length=3000)
    category = models.CharField(max_length=500)
    time = models.CharField(max_length=500)
    testPieces = models.ManyToManyField(Test_pieces_1_question)
    resultTestsList = models.ManyToManyField(Result_tests_list_1)

Мое мнение:

class Whole_test(mixins.ListModelMixin, generics.GenericAPIView):
    queryset = Test_1.objects.all()
    serializer_class = Test_Serializer
    filter_backends = [DjangoFilterBackend]

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

Спасибо!

Лучший способ сделать это - использовать пользовательские вложенные сериализаторы. И раскрывать поля, которые вы действительно хотите раскрыть для внешнего приложения. Это называется подходом нулевого доверия. Я лично предпочитаю его подходу exclude.

Давайте перепишем ваш сериализатор таким образом, чтобы достичь того же результата, что и depth =3

class Test_Serializer(serializers.ModelSerializer):
    testPieces = TimePiecesSerializer(many=True, read_only=True)
    resultTestsList = TimeResultSerializer(many=True, read_only=True)
    class Meta:
        model = Test_1
        fields = ["name", "category", "time", "testPieces", "resultTestsList"]

Как вы видите, я добавил вложенный сериализатор вместо depth=3

Вот код для этих пользовательских сериализаторов

class TimePiecesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Test_pieces_1_question
        fields = ["question", "yesScore", "noScore"]


class TimeResultSerializer(serializers.ModelSerializer):

    class Meta:
        model = Result_tests_list_1
        fields = ["text", "score", "unicode"]

Использование вышеуказанного подхода вложенного сериализатора даст вам те же результаты, что и depth, а также исключит ключ id, поскольку, похоже, он вас не интересует.

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

Вернуться на верх