如何使用 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,因为你似乎对它不感兴趣。
您可能需要根据自己的领域进行一些调整,但与其他方法相比,这是一种更有前途的方法。
如何在 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,因为你似乎对它不感兴趣。
您可能需要根据自己的领域进行一些调整,但与其他方法相比,这是一种更有前途的方法。