如何使用 DRF 排除同一深度级别的字段?

how to exclude fields that are in one depth level with DRF?

如何在 django rest 框架中排除一个深度级别的字段?
我想删除 testPieces 和 resultTestsList 中的 id 字段。

这是我的 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)

谢谢!

执行此操作的最佳方法是使用自定义嵌套序列化程序。并将您真正想要公开的字段公开给前端应用程序。它被称为 zero-trust 方法。我个人更喜欢它而不是 exclude 方法。

让我们以某种方式重写您的序列化程序,以获得与深度 =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"]

使用上面的嵌套序列化程序方法会给你与深度相同的结果,并且还会排除密钥 ID,因为你似乎对它不感兴趣。

您可能需要根据自己的领域进行一些调整,但与其他方法相比,这是一种更有前途的方法。