繁体   English   中英

将游标传递给django-rest-framework中的Serializer?

[英]Passing a cursor to a Serializer in django-rest-framework?

我正在使用Django 1.8和django-rest-framework v3.2.2。 我有一个涉及原始SQL的查询:

@api_view(['GET'])
def total_spending(request, format=None):
    code = request.query_params.get('code', None)
    query = 'SELECT * FROM vw_presentation_summary WHERE code=%s"
    cursor = connection.cursor()
    cursor.execute(query, tuple([code]))
    cursor.close()

我的问题是如何使用此光标并将其转换为我可以传递给django-rest-framework的Response的数据对象。

现在我正在手动完成它,它可以正常工作:

def dictfetchall(cursor):
    "Returns all rows from a cursor as a dict"
    desc = cursor.description
    return [
        dict(zip([col[0] for col in desc], row))
        for row in cursor.fetchall()
    ]

def total_spending(request, format=None):
    ...
    return Response(dictfetchall(cursor))

但是以某种方式使用Serializer会更好吗? 我不清楚Serializers除了定义你想要返回的字段之外还做了什么有用的事情。

除非您正在处理模型对象的某些复杂(包括嵌套)表示,否则如果您只是将它用于序列化对象,则序列化程序是过度的。 正如您已经注意到的那样,您的所有字段都可以本地序列化而无需任何额外步骤。

序列化程序非常适合于对输出进行整形(重命名字段,使用嵌套的序列化程序对它们进行分组)并始终如一地进行。 在使用Django模型时尤其如此,因为Django本身并不将模型对象序列化为Python字典,它更喜欢实际的模型对象。

序列化器的强大之处在于反序列化,它可以跨模型映射字段并为您构建关系。 它还可以对所有这些关系进行验证,这通常需要一段时间才能手动执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM