Django Rest Framework - POST请求,"此列表可能不为空"当列表不为空时?

时间:2016-05-05 18:16:20

标签: django post curl django-rest-framework

我使用Django rest框架来设置我自己的API并且无法使POST方法正常工作。我使用curl命令:

 create function total_cost_of_sofpack_in_lst3yrs
    (@pack_name varchar(20))
 returns table
 as
     return(
        select sum(packcost) as total_pk_cost, location
        from package
        inner join software on package.PACK = software.PACK
        inner join pc on software.tagnum = pc.tagnum
        where package.PACKNAME = @pack_name 
          and software.INSTDATE > dateadd(year, -3, getdate())
        group by pc.location)
     go

     select dbo.total_cost_of_sofpack_in_lst3yrs('Manta') as R

使用json文件exampleteam.json命中我的api格式如下:

 curl --form "fileupload=@exampleteam.json" 127.0.0.1:8000/teams/ > error.html

所以基本上,我想要的是创建一个拥有成员mem1和mem2并使用服务1的新团队.newTeam,mem1,mem2和service1都已存在于我的数据库中。

我得到的是这个奇怪的HTML,它告诉我列表中没有任何信息,而且数据库没有反映我曾经提出过请求。这是通过管道输入error.html:

[{"id":3,"name":"newTeam","members":["mem1", "mem2"],"services_used":["service1"]}]

这对我来说很奇怪,成员列表显然不是空的,我的请求中的services_used列表也不是。我有理由相信错误是我定义我的POST方法的地方,或者是我的模型有问题,尽管在弄乱那些我仍然无法找到问题之后。以下是这两个文件。

views.py

{"members":["This list may not be empty."],"services_used":["This list may not be empty."]}

以及models.py

中的相关模型
@api_view(['GET', 'POST'])
def team_list(request):
    if request.method == 'GET':
        teams = Team.objects.all()
        serializer = TeamSerializer(teams, many=True)
        return JSONResponse(serializer.data)

    elif request.method == 'POST':
        serializer = TeamSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

和TeamSerializer类:

class Team(models.Model):
    name = models.CharField(max_length=32, default="")
    members = models.ManyToManyField('Member')
    services_used = models.ManyToManyField('Service')

    def __str__(self):
        return str(self.name)

class Member(models.Model):
    name = models.CharField(max_length=32, default="")
    services_used = models.ManyToManyField('Service')

    def __str__(self):
        return str(self.name)

class Service(models.Model):
    name = models.CharField(max_length=64, default="")

    def __str__(self):
        return(self.name)

为什么POST请求没有正确更新数据库?

2 个答案:

答案 0 :(得分:2)

首先,如果要创建对象列表,则使用参数many

实例化序列化程序
...
elif request.method == 'POST':
    serializer = TeamSerializer(data=request.data, many=True)

第二件事,成员和服务应该是整数列表(已经存在的对象的PK),而不是字符串。

"members":[1, 2],"services_used":[1]

如果您发送文件而不是json作为有效负载,则需要执行此操作才能使其正常工作:

import json 

...
elif request.method == 'POST':
    # 'fileupload' is id specified in curl argument
    data = json.loads(request.data['fileupload'].read())
    serializer = TeamSerializer(data=data, many=True)

答案 1 :(得分:0)

如果您没有使用Muj Gabriel的答案指定的实例,您可以使用many=True选项在类的序列化程序中指定序列化程序(例如,类可能没有意义,但它仅适用于示例目的):

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book


class ChapterSerializer(serializers.ModelSerializer):
    books = BookSerializer(many=True)  # Allows us to create chapters without specifying book(s) straight away

    class Meta:
        model = Chapter