首页 > 解决方案 > 如何使用从外部站点获取的数据填充 Django 模型?

问题描述

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

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

在 中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()

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

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


根据@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'

标签: djangodjango-models

解决方案


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

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

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

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

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

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

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

并将其传递给ModelManager'screate()方法:

MyModel.objects.create(**kwargs)

确保字典中的所有键都对应于模型的字段。


推荐阅读