我使用Django作为后端服务器和前端电影应用程序的Vue.js。
我有张票模型
class MovieTicket(models.Model):
show = models.ForeignKey(Show)
seat = models.ForeignKey(Seat)
user = models.ForeignKey(User)
purchased_at = models.DateTimeField(default=timezone.now)
qrcode = models.ImageField(upload_to='qrcode', blank=True, null=True)
qrcode_data = models.CharField(max_length=255, unique=True, blank=True)
class Meta:
unique_together = ('show', 'seat')及其相关的序列化器
class MovieTicketSerializer(serializers.ModelSerializer):
class Meta:
model = MovieTicket
fields = '__all__'要购买新票,有一个视图映射到这个url http://dev.site.com/api/movies/buy-ticket/
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def buy_ticket(request):
serialized = MovieTicketSerializer(data=request.data)
if serialized.is_valid():
serialized.save()
return Response(serialized.data, status=status.HTTP_201_CREATED)
return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST)现在,从前端(Vue.js),我可以创建一个新的电影票:
const formBody = {
show: this.$store.state.showSelected.showTime.id,
user: this.$store.state.user.id,
// selectedSeats is an array of seats that have been selected by the user. Here I am passing the first seat object.
seat: this.$store.state.selectedSeats[0].seat.id
};
this.$http.post("http://dev.site.com/api/movies/buy-ticket/", formBody)
.then(function (response) {
console.log(response.data);
})
.catch(function (response) {
console.log(response);
});
return;如果表单有效,这将创建一个新的MovieTicket对象,否则会显示错误/s。
现在,假设用户选择了多个座位,我可以遍历每个selectedSeats数组并获得客户端的座位ids。然后发表这样的文章:
{
"purchased_at": null,
"qrcode": null,
"qrcode_data": "",
"show": 11,
"seat": [
106,
219
],
"user": 34
}但是,我感到困惑的是,如果Django rest框架每个请求只接受一个座位,并相应地显示错误,我如何通过多个seat.id?这意味着,如果票证可用或无效,则显示错误;如果它可用,则为该放映座位创建电影票。
发布于 2017-04-18 09:59:19
在序列化程序中使用many=True
在您的实现中,这非常容易实现:
serialized = MovieTicketSerializer(data=request.data, many=True)数据不是单个对象,而是一个对象数组。
您的信息建议您需要转换request.data以使这些多个对象(所有相同的数据只是不同的座位号)。对吗?
无论如何:
请参阅:如何使用Django Rest框架创建多个模型实例?
编辑:
以下是drf docu中的信息:http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-multiple-objects
(强烈建议自上而下阅读drf文档,然后再编写第一个真正的实现。有许多使用drf的方法,并且知道所有这些方法都会导致更好的决策)
编辑2(问题更新后):
您可以从客户端发送这个JSON (参见下面),也可以在调用buy_ticket(request)之前从客户机在您的MovieTicketSerializer(...,many=True)方法中发送的当前JSON创建此格式
[
{
"purchased_at": null,
"qrcode": null,
"qrcode_data": "",
"show": 11,
"seat": 106,
"user": 34
},
{
"purchased_at": null,
"qrcode": null,
"qrcode_data": "",
"show": 11,
"seat": 219,
"user": 34
}
]发布于 2017-08-29 21:57:49
这个答案是解决这个问题的一个很好的方法:
您可以简单地在get_serializer中覆盖APIView方法,并将many=True传递到基本视图的get_serializer中,如下所示:
class SomeAPIView(CreateAPIView):
queryset = SomeModel.objects.all()
serializer_class = SomeSerializer
def get_serializer(self, instance=None, data=None, many=False, partial=False):
if data is not None:
data.is_valid(raise_exception=True)
return super(SomeAPIView, self).get_serializer(instance=instance, data=data, many=True, partial=partial)
else:
return super(SomeAPIView, self).get_serializer(instance=instance, many=True, partial=partial)正如最初的post注释中提到的,在将data.is_valid()关键字传递给序列化程序的情况下,您还必须调用data。
发布于 2017-04-19 07:34:28
您可以在视图函数中检查座位数,并创建一张或多张票:
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def buy_ticket(request):
# Check if seats is a list
if isinstance(request.data['seat'], list):
seats = request.data.pop('seat')
models = []
for seat in seats:
# validate each model with one seat at a time
request.data['seat'] = seat
serializer = MovieTicketSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
models.append(serializer)
# Save it only after all seats are valid.
# To avoid situations when one seat has wrong id
# And you already save previous
saved_models = [model.save() for model in models]
result_serializer = MovieTicketSerializer(saved_models, many=True)
# Return list of tickets
return Response(result_serializer.data)
# Save ticket as usual
serializer = MovieTicketSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)它会起作用的,但老实说,这真是一团糟。您可以移动不同功能的座位创建逻辑,使它看起来更好。
https://stackoverflow.com/questions/43435247
复制相似问题