如何在Django Rest Framework响应中返回原始数据类型(而不是UUID)

时间:2015-11-04 00:33:47

标签: python django rest django-rest-framework

我想知道如何在Django Rest Framework的响应中返回原始数据类型,(尤其是对于UUID,以将它们作为string返回)。

我有这段代码:

class TicketCreateSerializer(BaseCreateSerializer):

    class Meta:
        model = Ticket
        fields = TICKET_FIELDS

    def to_representation(self, obj):
        obj = super(TicketCreateSerializer, self).to_representation(obj)
        return dict(obj)

它正在回归:

{
    'requester': UUID('e1ba1b8b-5d9b-473e-947b-971d795e9137'),
    'attachments': [],
    'assignee': UUID('f584c3cb-2c9d-4a26-8e59-1dd343839606'),
    'id': '00aa5549-f701-4b7e-82a5-5b2ac48c96ae',
    'location': UUID('9f9e5b8d-b156-47d9-98fc-bbec10788040'),
    'status': UUID('8a7edad5-19bb-4708-8d50-58a516749734'),
    'cc': [UUID('e8fb8a4b-d79c-4601-b31e-5abdbe8dbfee')],
    'priority': UUID('3f3ba388-6652-4744-9804-5d7e041cee7f'),
    'request': 'new request name',
    'categories': [UUID('c88f3e94-3d35-4816-80fb-6188fa6ec280')]
}

而不是ID的UUID数据类型,是否有一种简单的内置方式来返回ID的字符串?在Django Rest Framework中执行此操作?

基本上,如何返回原始python数据类型?

我觉得我过去已经解决了这个问题,但是不记得怎么......

1 个答案:

答案 0 :(得分:3)

DRF序列化分为两个步骤。

  1. 通过序列化程序将对象转换为dict,类型简单。
  2. dict将提供给渲染器以生成文档。
  3. “简单类型”的确切定义有点模糊。基本上,它是“渲染器接受的任何东西”。对于JSONRenderer,这意味着:

    • 所有基本的python类型
    • datetime.datetime / datetime.date / datetime.time / datetime.timedelta
    • decimal.Decimal
    • uuid.UUID
    • QuerySet
    • Numpy数组和数组标量
    • 任何类似dict或序列的对象。

    通常,您只会处理第1步,因为第2步由DRF Response自动处理。 DRF会根据视图的renderer_classes设置和请求的Accept标题自动选择呈现的内容。

    手动执行第2步

    如果由于某种原因需要自己生成文档(例如JSON文档),例如测试,则可以这样做。您只需要自己调用渲染器:

    from rest_framwork.renderers import JSONRenderer
    json = JSONRenderer().render(serializer.data)
    

    这样可以获得整个json文档bytestring。这是一个原子过程,它是整个文档,或者什么都没有。

    您可以设想创建一个自定义渲染器,该渲染器返回仅包含字符串值的字典,但这样做会超出您的目的。