在django-rest-framework中,序列化来自不同类的模型

时间:2015-04-01 03:09:49

标签: django python-3.x django-rest-framework

我正在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'

1 个答案:

答案 0 :(得分:2)

问题出在renderers.StaticHTMLRenderer

documentation这个渲染器是:

  

一个简单的渲染器,它只返回预渲染的HTML。与其他渲染器不同,传递给响应对象的数据应该是表示要返回的内容的字符串。

Renderer希望在响应数据中使用纯文本。然而,它接收dict并将其转换为字符串,只是迭代它。

您只需从renderer_classes=[renderers.StaticHTMLRenderer]个参数中删除@detail_route