【问题标题】:Simple operations with data requested from a Django model从 Django 模型请求的数据的简单操作
【发布时间】:2020-03-29 14:26:10
【问题描述】:

我正在尝试编写一个简单的 Web 应用程序,我可以在其中上传 csv 文件并返回每个文件的标题。一切正常。 id,文件的路径,保存在数据库中。

这是我得到的回应:

{
"id": 1,
"filefield": "http://127.0.0.1:8000/api/merged/1/uploads/header_body_test_zZr4Cea.csv"
}

我不明白的是,我可以在哪里或如何实际处理我从数据库请求的数据? 我想象的是一个不同的 url 路由,我可以在其中指定一个 id,响应将是这样的:

{
"id": 1,
"filefield": "http://127.0.0.1:8000/api/merged/1/uploads/header_body_test_zZr4Cea.csv"
"headers_of_csv": "Date;Amount"
}

我很难解释(或谷歌)我的问题到底是什么。我不明白执行此操作的代码实际上在哪里或如何执行(它是序列化程序的一部分,还是视图的一部分,还是在模型中?)。

或者更简单地说,假设我有一个模型,它有一个 id 和一个 3 位数字并返回:

{
"id": 1,
"number": 567
}

我如何或在哪里可以创建这样的响应:

{
"id": 1,
"number": 567
"first_digit_or_number": 5
}

非常感谢任何帮助,我只是不明白我应该寻找什么。

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

让我们从您的简单问题开始。您有示例中的模型:

class MyModel(models.Model):
    number = models.IntegerField()

然后您通过发送POST 请求来创建此模型的实例,这会产生以下对象:

{
    "id": 1,
    "number": 567
}

现在您要返回有关此对象的一些附加信息,至少在这种情况下,这些信息并未存储在数据库中,而是从有关该对象的其他信息中派生而来。这就是模型属性派上用场的地方。

class MyModel(models.Model):
    number = models.IntegerField()

    @property
    def first_digit_of_number(self):
        return int(str(self.number)[0])

请注意,如果您使用的是 django rest 框架,you will need to manually add this field to your serializer

回到 CSV 文件的示例,这意味着您可以向模型添加 headers_of_csv 属性,该属性将包含用于内省文件并返回标头的代码。

不过,根据您的用例,这里存在潜在的性能问题。如果您想在列表视图中公开此属性(即 - GET /thing/ 而不是 GET /thing/{id}/),您最终可能会打开数千个文件以容纳单个请求(因为信息每次都是动态生成的)。这没有多大意义,因为只有 CSV 文件更改时信息才会更改。在这种情况下,您可以考虑将headers_of_csv 添加为实际的数据库列,并添加populate it when a model gets saved

【讨论】:

  • 这正是我想要做的,我刚刚有时间尝试@property 解决方案,而且效果很好。当我下班回家时,我会阅读/尝试其余的内容,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2016-10-19
  • 2012-08-26
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多