Как исключить поля, находящиеся на одном уровне глубины с помощью DRF?
как исключить поля, находящиеся на одном уровне глубины в django rest framework?
Я хочу удалить поле id в testPieces и resultTestsList.
вот мой API:
мой сериализатор:
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, поскольку, похоже, он вас не интересует.
Возможно, вам потребуется небольшая настройка в соответствии с вашими полями, но это более перспективный подход по сравнению с другими.
