ASP.NET 参数绑定的 Django 或 Rails 动作控制器参数上的 Ruby
Django equivalent of ASP.NET Parameter Binding or Ruby on Rails Action Controller Parameters
我想知道标题中提到了什么。这是提到的例子的链接,关于其他技术:
目前我正在构建一个 API 使用 DRF 并在视图中使用自定义代码或序列化器验证方法来验证参数,如下所示:
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"]
您可以将字段声明为只读(直接或使用 extra kwarg)。你不能写它,但它会包含在输出中。我不确定你为什么要这样做,但如果你正在使用 return 数据并在那里需要它,它会很有帮助。
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",
]
我想知道标题中提到了什么。这是提到的例子的链接,关于其他技术:
目前我正在构建一个 API 使用 DRF 并在视图中使用自定义代码或序列化器验证方法来验证参数,如下所示:
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"]
您可以将字段声明为只读(直接或使用 extra kwarg)。你不能写它,但它会包含在输出中。我不确定你为什么要这样做,但如果你正在使用 return 数据并在那里需要它,它会很有帮助。
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",
]