【问题标题】:How to populate the Django Model with the data fetched from the external site?如何使用从外部站点获取的数据填充 Django 模型?
【发布时间】:2019-05-24 10:27:48
【问题描述】:

通过 API 从外部站点,我获取了要保存到 Django 模型的字典数据。

我尝试将数据保存到models.py 的 Django 模型中,但失败了。

models.py 中,我写了def get_save(self, request),如下所示。

class AirData(models.Model):
    co = models.DecimalField(max_digits=5, decimal_places=2)
    no2 = models.DecimalField(max_digits=5, decimal_places=2)
    so2 = models.DecimalField(max_digits=5, decimal_places=2)
    pm10 = models.DecimalField(max_digits=5, decimal_places=2)
    pm25 = models.DecimalField(max_digits=5, decimal_places=2)
    datatime = models.DateTimeField(blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    station = models.CharField(max_length=80)

    def get_save(self, request):

            url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty"

            params = {'stationName': '강남구', 'dataTerm': 'month', 'pageNo': '1', 'numOfRows': '10',
                      '_returnType': 'json', 'ServiceKey': service_key, 'ver': '1.3'}
            airdata_dict = get_airdata(url, service_key, params)

            self.co = airdata_dict['coValue']
            self.save()

但是从 url 获取的 airdata_dict 没有保存到实例中。

请帮我演示如何在模型中保存数据。


根据@HariHaraSudhan 的建议,我将views.py 更改如下

def get_value(self):
    url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty"

    params = {'stationName': '강남구', 'dataTerm': 'month', 'pageNo': '1', 'numOfRows': '10',
              '_returnType': 'json', 'ServiceKey': service_key, 'ver': '1.3'}
    airdata_dict = get_airdata(url, service_key, params)
    airdata_list = airdata_dict['airdata']
    kwargs = dict()
    for data in airdata_list:
        kwargs['station'] = data['stationName']
        kwargs['co'] = data['coValue']
        kwargs['no2'] = data['no2Value']
        kwargs['so2'] = data['so2Value']
        kwargs['o3'] = data['o3Value']
        kwargs['pm10'] = data['pm10Value']
        kwargs['pm2.5'] = data['pm25Value']
        kwargs['time'] = data['dataTime']

    obj = AirData.objects.create(self.kwargs)

而且models.py也改成:

class AirData(models.Model):
    @classmethod
    def create(cls, **kwargs):
        my_obj = cls(kwargs)
        return my_obj

但错误弹出为 AttributeError: 'WSGIRequest' object has no attribute 'kwargs'

【问题讨论】:

  • 你怎么打电话给get_save()?你在哪里创建实例?在你的方法中,你只设置co,没有别的。其他必需的属性,如no2 等呢?向我们展示您正在做什么以查看数据未保存。
  • get_save() 不是合适的名称。我只是使用 coValue 来查看它是否有效。如果是这样,我也计划填充其他属性。但它不起作用。没有错误消息,但未填充模型。
  • “不赞成”?我不明白
  • 抱歉打错了。请阅读新评论。
  • 但您需要在 调用 get_save() 的位置显示代码。和print(airdata_dict) 显示字典中的内容。

标签: django django-models


【解决方案1】:

你的模型方法get_save应该在以下情况下工作:

  1. 您确保将 API (airdata['coValue']) 接收到的字符串转换为正确的类型,例如对于co

    self.co = Decimal(airdata['coValue'])
    

    还要注意您的日期是字符串,因此如果您要分配它们,则需要将它们更改为正确的 datetime.datetime

  2. 您确保在保存之前设置了所有必填字段(self.no2 是必需的,所以如果是None,您的模型将不会保存)。在这种情况下,您应该会看到一个错误。

更简单的方法是创建一个包含所有正确值的字典,例如

kwargs['co'] = Decimal(airdata['coValue'])
...

并将其传递给ModelManagercreate() 方法:

MyModel.objects.create(**kwargs)

确保字典中的所有键与模型的字段相对应。

【讨论】:

  • 谢谢你,@dirkgroten。由于您的帮助,我仍在努力,但越来越接近答案。我会努力的。
  • 最后,我设法让它工作,尽管该程序可能不是最好的方法。再次感谢您。
猜你喜欢
  • 2016-05-17
  • 2010-10-06
  • 2020-07-23
  • 2011-06-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
相关资源
最近更新 更多