【问题标题】:django rest framework: limit fields that can be updateddjango rest框架:限制可以更新的字段
【发布时间】:2015-12-15 12:05:52
【问题描述】:

我希望用户只能更新一个特定字段。例如:

models.py

class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ('created',)

serializer.py

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

views.py

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

一旦Snippet 创建,用户应该只能更新title 字段。

我知道我可以通过以下方式实现:

serializers.py

def update(self, instance, validated_data):
        """
        Update and return an existing `Snippet` instance, given the validated data.
        """
        instance.title = validated_data.get('title', instance.title)
        instance.save()
        return instance

在序列化程序类中。但我想知道,有没有办法让可浏览的 api 在编辑表单中只显示title 字段?并且还跳过对不需要的字段的验证?

【问题讨论】:

  • 你找到解决方案了吗?

标签: django django-rest-framework


【解决方案1】:

Django REST Framework 提供了read_onlywrite_only 属性来控制用于编辑的内容和不用于编辑的内容。

serializers.py

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
        extra_kwargs = {
            'id': {'read_only': True},
            'code': {'read_only': True},
            'lineos': {'read_only': True},
            'language': {'read_only': True},
            'style': {'read_only': True}
        }

上面将返回读取请求的所有字段,但只有标题是可写的。 您可以在官方文档中找到更多信息: http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

【讨论】:

  • 谢谢!到了一半……read_only 字段消失了。但它们以POSTPUT 形式消失了:(.
  • 这样您将无法使用create read_only 字段。我猜 OP 想创建字段,但不更新。
猜你喜欢
  • 1970-01-01
  • 2020-09-29
  • 2013-10-08
  • 2023-03-30
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多