使用从Django模块请求的数据进行的简单操作

2024-10-04 01:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个简单的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
}

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


Tags: 文件csv模型testapiid数据库http
1条回答
网友
1楼 · 发布于 2024-10-04 01:36:18

让我们从你的简单问题开始。您可以使用示例中的模型:

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

相关问题 更多 >