使Django restapi接受lis

2024-09-30 10:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个功能,我需要能够将一个由属性组成的列表发布到API。属性有namevalue和{}。现在我有两个问题:

  1. 我的列表应该如何从一开始就让API接受它作为一个正确的列表呢?我应该将列表解析为对象吗?或者一张简单的单子行吗?在
  2. 我使用的是Django REST框架,并使用this教程制作了API(工作非常完美)。但是如何让Django接受多个对象/a列表呢?我已经读过,这很简单,只需将many = True添加到实例化序列化程序的位置,我在这里做的是:

(由于某些原因,除非我在此处输入文本,否则代码不会格式化)

class PropertyViewSet(viewsets.ModelViewSet):  
    queryset = Property.objects.all()  
    serializer_class = PropertySerializer

所以我尝试做serializer = PropertySerializer(queryset, many=True),这破坏了API视图。因此,我想我必须为此创建一个新的序列化程序和视图(对吗)?但是如何确保我的API知道在正确的时间使用哪一个呢?在

如果有人能澄清这一点那就太好了,谢谢。在


Tags: 对象django程序功能视图apitrue列表
2条回答

ModelViewSet类提供了一个create()方法,该方法一次只允许创建一个对象。见docs

如果要发布对象列表并将每个对象插入数据库,则必须创建一个自定义视图。例如

from rest_framework.decorators import api_view
from django.shortcuts import redirect
from .models import MyModel

@api_view(['POST'])
def insert_list(request):
    if request.method == 'POST':
        for obj in request.POST['list']: #assuming you are posting a 'list' of objects
            MyModel.objects.create(name=obj.name, value=obj.value, unit=obj.unit)
    return redirect('url of MyObject List View')

要在viewset旁边使用自定义apieview,只需将自定义apieview添加到viewset url不使用的其他url中,例如,如果viewset使用r'^myModel/$',那么对createlist自定义apieview使用{}

如果您需要创建对象,下面是我的操作方法:

# Mixin that allows to create multiple objects from lists.
class CreateListModelMixin(object):
    def get_serializer(self, *args, **kwargs):
        """ if an array is passed, set serializer to many """
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)

然后,在您希望在just do中使用它的视图中:

^{pr2}$

这已经是它了(确保在视图之前把mixin作为一个参数;就像我做的那样)。在

现在您的postrequest的正文如下所示:

{
  [
    {
      "name": "<some_name>"
      "value": "<some_value>"
      "unit": "<some_unit>"
    },
    {
      "name": "<some_name>"
      "value": "<some_value>"
      "unit": "<some_unit>"
    },
    {
      "name": "<some_name>"
      "value": "<some_value>"
      "unit": "<some_unit>"
    },
    ...
  ]
}

最酷的是,通过这种方式,你也可以只发布一个像这样的对象:

{
  "name": "<some_name>"
  "value": "<some_value>"
  "unit": "<some_unit>"
}

我希望这有帮助!:)

相关问题 更多 >

    热门问题