相当于ASP.NET参数绑定或RubyonRails操作控制器参数的Django



我想知道标题中提到了什么。这是提到的关于其他技术的例子的链接:

  • 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=

  1. 添加到模型中的新字段不可自动更新
  2. 所有可更新字段都是显式并清楚列出的
  3. 单元测试现在可以是显式的,并且输出格式是一致的
class AnimalWriteSerializer(serializers.ModelSerializer):
class Meta:
model = Animal
fields = [
"name",
"mission",
"favorite_color",
]

最新更新