我想知道标题中提到了什么。这是提到的关于其他技术的例子的链接:
- ASP.NET参数绑定
- Ruby on Rails操作控制器参数
目前我正在使用DRF构建API,并在视图或序列化程序中使用自定义代码验证方法来验证参数,如以下所示:
class AnimalWriteSerializer(serializers.ModelSerializer):
class Meta:
model = Animal
fields = '__all__'
def validate_dicose_category(self, value):
raise serializers.ValidationError('Dicose Category cannot be set manually.')
有更好的方法吗?
由于在您的示例中,您告诉序列化程序支持__all__
字段,因此需要禁用手动更新该字段。
您可能打算使用exclude
,如下面的示例中所示,这将简单地从"中删除字段;所有";。exclude
和使用read_only
之间的主要区别在于输出将包括dicose_category
。
使用exclude=
排除此字段。这与fields=
相反,一次只能使用一个。
class AnimalWriteSerializer(serializers.ModelSerializer):
dicose_category = serializers.CharField(read_only=True)
class Meta:
model = Animal
exclude = ["dicose_category"]
您可以将字段声明为只读(直接或使用额外的kwarg(。你不能写它,但它会包含在输出中。我不知道你为什么要这样做,但如果你正在使用返回数据进行某些操作并需要它,这会很有帮助。
class AnimalWriteSerializer(serializers.ModelSerializer):
dicose_category = serializers.CharField(read_only=True)
class Meta:
model = Animal
fields = "__all__"
# or declare an extra_kwarg which does the same thing:
class AnimalWriteSerializer(serializers.ModelSerializer):
class Meta:
model = Animal
fields = "__all__"
extra_kwargs = {
"dicose_category": { "read_only": True }
}
最后,我强烈建议列出所有要直接更新的字段,而不是使用__all__
或exclude=
。
- 添加到模型中的新字段不可自动更新
- 所有可更新字段都是显式并清楚列出的
- 单元测试现在可以是显式的,并且输出格式是一致的
class AnimalWriteSerializer(serializers.ModelSerializer):
class Meta:
model = Animal
fields = [
"name",
"mission",
"favorite_color",
]