【问题标题】:Django Rest Framework Batch CreateDjango Rest Framework 批量创建
【发布时间】:2014-02-21 18:18:55
【问题描述】:

我正在尝试制作一个 api,您可以在其中使用 django rest 框架通过单个 Post 请求创建多个对象。但是,我的序列化程序提供了一个我不明白的错误。首先是我的代码框架

我的序列化器:

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

有人知道为什么会这样吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    这对我有用。我不得不遍历项目列表。

    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()
    

    【讨论】:

    • 很难看出这是如何回答问题的。你能说明为什么这解决了问题中的问题吗?也许通过关注代码的哪一部分与问题相关?
    • 问题是如何通过单个发布请求创建多个对象。上面的代码,感谢选项 many = True 允许您通过单个请求创建许多对象。您可以在 serializer.validated_data 中找到发布的数据,然后在此列表上进行交互以创建您想要的对象。
    【解决方案2】:

    我找到了!序列化程序实际上并没有使用 many 选项,所以我不得不覆盖 MyModelListView 中的 get_serializer 方法

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2018-06-02
      • 2019-05-20
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多