我使用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请求没有正确更新数据库?
答案 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