代码之家  ›  专栏  ›  技术社区  ›  Sreekanth Reddy Balne

如何在django-rest框架中将参数传递给序列化程序?

  •  0
  • Sreekanth Reddy Balne  · 技术社区  · 6 年前

    我有一个序列化程序:

    class DataSerializer(serializers.Serializer):
        skip_place = True
        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'

    2 回复  |  直到 6 年前
        1
  •  1
  •   aman kumar    6 年前

    嗨,你可以覆盖 初始化 方法,从中弹出值并赋给变量。

    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.")
    
        2
  •  3
  •   uedemir    6 年前

    你可以把它和 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.")