2016-03-29 3 views
0

У меня есть класс ModelSerializer, в котором я хочу принять список элементов или один элемент (словарь) в качестве данных. В документации указано, что передача «много», как True, будет поддерживать мое требование.ModelSerializer с данными как список

class PointSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Point 

    def __init__(self, *args, **kwargs): 
     if "data" in kwargs: 
      if isinstance(kwargs["data"]): 
       kwargs["many"] = True 
     super(PointSerializer, self).__init__(*args, **kwargs) 

Теперь, обеспечивая словарь данных следующим образом работы:

p = PointSerializer(data={'x':10, 'y': 12}) 
p.is_valid() # True 

Но это, со списком словарей, не удается:

p = PointSerializer(data=[{'x':10, 'y':12}, {'x':12, 'y':12}]) 
p.is_valid() # False 
p.errors() # {'non_field_errors': ['Invalid data. Expected a dictionary, but got a list.']} 

UPDATE:

Спасибо к выбранному ответу, я изменил свой код на followi нг и она отлично работает:

class PointSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Point 

>>> ps = PointSerializer(data={'x':10, 'y':12}) 
>>> ps.is_valid() 
... True 
>>> ps = PointSerializer(data=[{'x':10, 'y':12}, {'x':12, 'y':12}], many=True) 
>>> ps.is_valid() 
... True 

ответ

1

many=True аргумент будет работать только тогда, когда инстанцировании сериализатор, потому что он будет возвращать ListSerializer за сценой.

Ваш вариант: либо вы установите для параметра many = True, как аргумент serializer во время вызова создания, либо используйте явно ListSerializer.

Смежные вопросы