我想知道如何在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数据类型?
我觉得我过去已经解决了这个问题,但是不记得怎么......
答案 0 :(得分:3)
DRF序列化分为两个步骤。
“简单类型”的确切定义有点模糊。基本上,它是“渲染器接受的任何东西”。对于JSONRenderer
,这意味着:
datetime.datetime
/ datetime.date
/ datetime.time
/ datetime.timedelta
decimal.Decimal
uuid.UUID
QuerySet
通常,您只会处理第1步,因为第2步由DRF Response
自动处理。 DRF会根据视图的renderer_classes
设置和请求的Accept
标题自动选择呈现的内容。
手动执行第2步
如果由于某种原因需要自己生成文档(例如JSON文档),例如测试,则可以这样做。您只需要自己调用渲染器:
from rest_framwork.renderers import JSONRenderer
json = JSONRenderer().render(serializer.data)
这样可以获得整个json文档bytestring
。这是一个原子过程,它是整个文档,或者什么都没有。
您可以设想创建一个自定义渲染器,该渲染器返回仅包含字符串值的字典,但这样做会超出您的目的。