2014-01-29 43 views
8

我想要使用Django rest框架创建一个可以使用单个Post请求创建多个对象的api。但是,我的序列化程序提供了一个我不明白的错误。首先这里是我的代码的骨架Django Rest框架批量创建

我的串行:

class MyModelSerializer(serializers.ModelSerializer): 
# override the constructor to always use the many flag 
def __init__(self, *args, **kwargs): 
    many = kwargs.pop('many', True) 
    super(MyModelSerializer, self).__init__(many=many, *args, **kwargs) 

class Meta: 
    model = MyModel 
    fields = ('field1', 'field2') 

我的列表视图

class MyModelListView(generics.ListCreateAPIView): 
    queryset = MyModel.objects.all() 
    serializer_class = MyModelSerializer 

    def post(self, request, *args, **kwargs): 
     if request.DATA['batch']: 
      json = request.DATA['batchData'] 
      stream = StringIO(json) 
      data = JSONParser().parse(stream) 
      request._data = data 
     return super(CharacterDatumList, self).post(request, *args, **kwargs) 

我的Ajax调用

$.ajax({ 
    type: "POST", 
    url: '/characterDatum/', 
    data: { 
     'batch' : true, 
     'batchData' : '[{"field1": "x", "field2": "y", },{"field1": "a", "field2": "b"}]' 
    }, 
    success: function(response) { 
     console.log('success'); 
    }, 
    datatype: 'json' 
}); 

然而,在Django的REST框架我在

以下的行收到序列化验证错误
class CreateModelMixin(object): 
    """ 
    Create a model instance. 
    """ 
    def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.DATA, files=request.FILES) 
     if serializer.is_valid(): # returns not valid 

有没有人知道为什么这可能是这种情况?

回答

6

我找到了!串行器实际上并没有使用很多的选择,所以我不得不重写get_serializer方法MyModelListView

def get_serializer(self, instance=None, data=None, 
         files=None, many=True, partial=False): 
     return super(MyModelListView, self).get_serializer(instance, data, files, many, partial) 
+0

这也是为我工作的人。 – Blairg23

2

这里是我工作。我不得不迭代项目列表。

class ProportionViewSet(viewsets.ModelViewSet): 
    queryset = Proportion.objects.all() 
    serializer_class = ProportionSerializer 

    def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data, many=True) 
     serializer.is_valid(raise_exception=True) 

     ### 
     # First we need to iterate over the list o items 
     ### 

     for single_proportion in serializer.validated_data: 
      # Try to get proportion from database for selected user 
      try: 
       proportions = Proportion.objects.get(user=self.request.user, category=single_proportion['category']['id']) 
       proportions.some_property = "New value" 
       proportions.save() 
      # If it is not in the model, then we should create it 
      except Proportion.DoesNotExist: 
       proportion = Proportion(
        category=Category.objects.get(id=single_proportion['category']['id']), 
        proportion_in_clicks=single_proportion['proportion_in_clicks'], 
        user=single_proportion['user'] 
       ) 
       proportion.save() 
+0

这是一个有点难以看出这是如何回答这个问题。你能说明为什么这解决了问题中的问题吗?也许通过关注哪部分代码与问题有关? – kdbanman

+0

问题是如何用单个发布请求创建多个对象。上面的代码,多亏了选项** many = True **允许您使用单个请求创建多个对象。你可以在serializer.validated_data中找到发布的数据,然后遍历这个列表来创建你想要的对象。 –

相关问题