我正在Django写一个销售点(POS)系统。我有基本功能,在添加更多复杂功能之前,我正在尝试清理代码。
作为这项工作的一部分,我正在将我的AJAX调用转移到使用django-rest-framework的API的一部分。
在我的模型中,我有一个代表客户购买的所有商品的交易。该交易中的每个单独购买都是一个LineItem。在我的TransactionViewSet api类中,我有一个名为ring_plu的函数。它接收UPC和数量,将该项作为LineItem添加到UPC,然后我希望它返回新的LineItem。代码看起来像这样。
TransactionViewSet
@detail_route(
methods=['post'],
renderer_classes=[renderers.StaticHTMLRenderer]
)
def ring_upc(self, request, *args, **kwargs):
upc = request.POST['upc']
quantity = request.POST['quantity']
if len(upc) != 12:
return Response('Invalid UPC', status=status.HTTP_400_BAD_REQUEST)
grocery = get_object_or_404(Grocery, upc=upc)
transaction = self.get_object()
line_item = transaction.create_line_item(grocery, quantity)
serializer = LineItemSerializer(line_item, context={'request':request})
return Response(serializer.data)
我正在使用POST正文{'upc':'071990095314','quantity':1}
调用/ api / transactions / 10 / ring_upc /并请求应用程序/ json响应。我得到的就是这个。
urlcodequantityscaledescriptionpricestatustransactionitem
我已经为序列化器提供了一些不同的选项,但我似乎无法让序列化器正常工作。
以下是代码中可能有用的其他部分。
serializers.py
class LineItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = LineItem
models.py
class LineItem(models.Model):
transaction = models.ForeignKey(Transaction)
code = models.CharField(max_length=30)
quantity = models.DecimalField(max_digits=15, decimal_places=0)
scale = models.DecimalField(max_digits=19, decimal_places=4, null=True)
description = models.CharField(max_length=100)
price = models.DecimalField(max_digits=17, decimal_places=2)
item = models.ForeignKey('inventory.Item')
status = models.CharField(max_length=8, default='ACTIVE')
def __unicode__(self):
return str(self.scale) + ' x ' + self.description + ' ' +\
self.description
def total(self):
return self.price * self.quantity
def cancel(self):
self.status = 'INACTIVE'
答案 0 :(得分:2)
问题出在renderers.StaticHTMLRenderer
。
从documentation这个渲染器是:
一个简单的渲染器,它只返回预渲染的HTML。与其他渲染器不同,传递给响应对象的数据应该是表示要返回的内容的字符串。
Renderer希望在响应数据中使用纯文本。然而,它接收dict
并将其转换为字符串,只是迭代它。
您只需从renderer_classes=[renderers.StaticHTMLRenderer]
个参数中删除@detail_route
。