Django-Rest框架:httppost和PUT的不同验证

2024-10-04 11:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的DataSerliazer中有一个自定义验证函数,它检查两个参数(mrange,mthreshold)。验证函数检查过帐时是否只需设置其中一个参数。在

class DataSerializer(serializers.ModelSerializer):
    emails = serializers.ListField(child = serializers.EmailField())
    class Meta:
        model = AIData
        fields = ('id', 'name', 'created', 'username', 'token',
                  'expression','key','threshold' ,'evaluator', 'range','emails','metric_name', 'status')

   def validate(self,attrs):
mrange = attrs.get("metric_range")
        mthreshold  = attrs.get("metric_threshold")
    if (mrange == None or mrange == " ") and (mthreshold == None or mthreshold == " "):
            raise serializers.ValidationError({'error': 'Cannot have both range and threshold empty'})
        elif mrange != None and mthreshold != None:
            raise serializers.ValidationError({'error': 'Cannot set both range and threshold'})

在我的视图.py文件

^{pr2}$

目前,我必须编写antorAIAnotherSerializerMethod,这样它就不会隐式调用DataSerializer中的validate函数。这是为了避免在对象创建期间检查2个参数。一旦创建了对象,我就不想再检查相同的函数了。有没有更简洁的方法来做同样的事?我最好避免为同一模型编写2个序列化程序。在


Tags: and函数namenone参数thresholdrangemetric
2条回答

据我所知,rest框架库没有类似的东西。在

我的方法是覆盖__init__,并添加您自己的变量来检查这一点。在

class DataSerializer(serializers.ModelSerializer):
    emails = serializers.ListField(child = serializers.EmailField())
    class Meta:
        model = AIData
        fields = ('id', 'name', 'created', 'username', 'token',
                  'expression','key','threshold' ,'evaluator', 'range','emails','metric_name', 'status')

    def __init__(self, *args, **kwargs):
        super(DataSerializer, self).__init__(*args, **kwargs)
        self._request_method = kwargs.get('request_method', 'GET')

    def validate(self,attrs):
        if self._request_method == 'GET':
            # GET logic
        elif self._request_method in ('PUT', 'POST'):
            # Put or Post logic

然后我会这样使用它:

^{pr2}$

您可以将^{} data传递给可能包含请求本身的序列化程序。在

通过调用自我语境. 在

此解决方案确实使提供上下文数据更容易,而不重写__init__。在

相关问题 更多 >