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=

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