【问题标题】:How to pass arguments to a Serializer in django-rest-framework?如何将参数传递给 django-rest-framework 中的序列化器?
【发布时间】:2019-06-14 04:10:26
【问题描述】:

我有一个序列化程序:

类数据序列化器(序列化器。序列化器): skip_place = 真 name = serializers.CharField(max_length=None) place = serializers.CharField(max_length=None,required=False) def validate_place(self,value): if not skip_place and len(value)<=0: raise serializers.ValidationError("Place is required.")

现在观察skip_place。如果我将DataSerializer 实例称为:

DataSerializer(data=data, skip_place=False)

然后它应该验证代码中的place

但我无法传递参数skip_place=True。我收到一个错误:TypeError: __init__() got an unexpected keyword argument 'skip_place'

【问题讨论】:

  • 您的代码缩进是否正确?看起来validate_placeDataSerializer 类的方法。但目前它是作为模块级函数编写的。
  • @AbdulNiyasPM 抱歉,已更正。请检查。

标签: python django python-3.x django-models django-rest-framework


【解决方案1】:

您可以使用including extra context 发送。

在视图中;

DataSerializer(data=data, context={'skip_place': True}) # or False

在序列化器中;

class DataSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=None)
    place = serializers.CharField(max_length=None,required=False)

    def validate_place(self,value):
        skip_place = self.context.get("skip_place") # <- here we use self.context to get extra args
        if not skip_place and len(value)<=0:
            raise serializers.ValidationError("Place is required.")

【讨论】:

    【解决方案2】:

    您好,您可以覆盖序列化程序的 init 方法,从那里弹出值并分配给变量。

    class DataSerializer(serializers.Serializer):
       skip_place = True
       name = serializers.CharField(max_length=None)
       place = serializers.CharField(max_length=None,required=False)
    
       def __init__(self, *args, **kwargs):
           self.skip_place = kwargs.pop('skip_place ', False)
           super().__init__(*args, **kwargs)
    
       def validate_place(self,value):
         if not self.skip_place and len(value)<=0:
            raise serializers.ValidationError("Place is required.")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2018-06-13
      • 1970-01-01
      • 2020-09-14
      • 2019-03-02
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多