簡體   English   中英

如何在Django REST中為序列化器棄用冗余密鑰?

[英]How to deprecate redundant keys in Django REST for serializer?

我有:

models.py:

class MyModel(models.Model):
    uuid = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False)
    name = models.CharField(max_length=32)

resources.py:

class MyModelSerializer(serializers.ModelSerializer):

    class Meta(object):
        model = models.MyModel

class MyModelViewSet(viewsets.ModelViewSet):

    queryset = models.MyModel.objects.all()
    serializer_class = LinkSerializer

我可以執行以下請求:curl -X“ POST” -H“內容類型:application / json” -d'{“ name”:“ name1”,“ redundant”:“ value”}' http://127.0。 0.1:8000 / mymodel /

我會得到201。

我的問題是:“如何棄用冗余密鑰?” 模型(或MyModelSerializer)不包含的鍵。

更新。
好吧,我創建了以下mixin:

from rest_framework import serializers
from rest_framework import exceptions as rest_framework_exceptions

class RedundantSerializer(serializers.Serializer):
    """This Mixin should provide possibility for checking redundant keys

    in request data
    """

    def to_internal_value(self, data):
        _writable_fields_names = [
            field.source for field in self._writable_fields
        ]
        errors = {}
        for key in data.keys():
            if key not in _writable_fields_names:
                errors[key] = "This field is redundant"
        if errors:
            raise rest_framework_exceptions.ValidationError(errors)
        return super(RedundantSerializer, self).to_internal_value(data)

並在上面的Serializer中繼承了它:

class MyModelSerializer(RedundantSerializer, serializers.ModelSerializer):

    class Meta(object):
        model = models.MyModel

您將需要覆蓋視圖的創建/更新,並將request.data中的鍵與serializer.validated_data中的鍵進行比較(使用一組鍵即可輕松完成):

deprecated_keys = set(request.data.keys()) - set(serializer.validated_data)

然后,您將處理所需的任何邏輯:例如,使用已棄用的鍵返回400錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM