在DRF中,我经常遇到天气问题,是否应该为特定视图创建自定义序列化程序。总是想弄清楚现有的序列化程序是否可以修改以执行我想要的操作。
示例:
class ProductReviewSerializer(serializers.ModelSerializer):
product_name = serializers.SerializerMethodField(read_only=True)
class Meta:
model = ProductReview
fields = (
'uuid',
'review_score',
'user',
'product',
)
read_only_fields = (
'uuid',
)
def get_product_name(self, obj):
something ...
我正在使用此序列化程序来创建ProductReview
的新实例。此外,我也想使用此序列化程序来更新ProductReview
的实例。为此,序列化程序应验证来自API端点的数据,该端点忽略了许多字段,例如。 G。 DRF API仅接收JSON {review_score: 2)
。对于给定的示例,除非我将一堆字段声明为read_only
,否则序列化器才有效,这反过来对创建新实例无效。
用于编辑ProductReviews的序列化程序,该序列化程序从上方接受数据({review_score: ...}
),看起来像这样:
class ProductReviewEditSerializer(serializers.ModelSerializer):
class Meta:
model = ProductReview
fields = (
'review_score',
)
我觉得我在这里制造了一些愚蠢的设计缺陷。但是您能指出我一个更好的解决方案的方向吗?
创建大量单独的序列化程序是走的路吗?我的直觉告诉我,每个模型都应该只有一个序列化器...
答案 0 :(得分:1)
实际上,这是一个很好的问题。我在分享应该使用序列化程序时的观点。读出其他人对此的想法将是很棒的。
我坚信大多数情况下都有可能。仍然有一些情况是不可能的。我发现DRF-ModelSerializer
非常适合这项工作,而且组织得很好。如果您的模型定义正确组织。如果需要任何其他的get响应,我们可以始终为该作业使用SerializerMethodField
。
我打算不要传递要用请求数据更新的模型实例。对于使用序列化进行部分更新,我们应该执行以下操作
serializer = ProductReviewSerializer(product_review_model_instance, data=request.data, partial=True)