【问题标题】:Using raw SQL in django-rest framework?在 django-rest 框架中使用原始 SQL?
【发布时间】:2015-08-22 18:40:34
【问题描述】:

我正在使用带有 Postgres 9.4 后端的 Django 1.8 和表格和物化视图。

我有一个名为 spending 的 80GB 表,其中包含支出项目,每个项目都有一个组织代码和一个地区代码:

class Prescription(models.Model):
  region = models.ForeignKey(Region)
  organisation = models.ForeignKey(Organisation)
  month = models.DateField()
  amount = models.FloatField()

我还有一个从spending 表生成的spending_by_region 的物化视图:

CREATE MATERIALIZED VIEW spending_by_region AS 
      SELECT region, month, SUM(amount) AS amount 
      FROM spending
      GROUP BY month, region_id

(我使用物化视图是因为数据非常大而且是静态的,实际上是一个数据仓库。)

我的一些 Django 视图使用物化视图,例如我对每个地区的看法。在这些情况下,我使用原始 SQL 来运行 select * from spending_by_region where region=123,因为当然 Django 的 ORM 不知道物化视图。

现在我想开始为我的应用程序实现一个 API。我听说过关于 django-rest-framework 的好消息,但是是否可以在序列化之前使用原始 SQL 查询来获取数据?

例如,如果我想要一个名为 /spending_by_region/123 的 API 方法,是否可以运行与上述相同的查询?

我找到了this example,但它仍然与模型字段相关联,而不是纯粹的原始 SQL。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    Django-Rest-Framework 在 Django 应用程序的顶部工作,您可以为所需的模型设置自定义管理器并执行原始查询,或者简单地使用 Django 的 ORM 中的 .raw() 方法。它与任何其他 Django 应用程序一样,但您获得了响应 JSON 对象的视图和序列化程序。

    【讨论】:

    • 谢谢 - 我什至不会真正使用 .raw() 方法,我将直接执行自定义 SQL 并返回一个光标 - docs.djangoproject.com/en/1.8/topics/db/sql/… 然后我可以将光标传递给 django-以某种方式休息框架?
    • 是的,我猜你在一个视图中执行它,使用 DRF,你有从 APIView 扩展的视图,你可以在那里定义方法(通常是 POST),并在那里执行任何 Python/Django 有效代码, 并使用 Response 方法将其作为 JSON 返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2021-09-04
    • 2021-08-22
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多