如何使用从外部站点获取的数据填充Django模型?

时间:2019-05-24 10:27:48

标签: django django-models

我已通过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'对象没有属性'kwargs'

2 个答案:

答案 0 :(得分:1)

在以下情况下,您的模型方法get_save应该有效:

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

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

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

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

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

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

并将其传递给ModelManager的{​​{1}}方法:

create()

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

答案 1 :(得分:-1)

我认为更好的创建方法是使用alternative constructor

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

在视图中从API中获取值

def get_value(self):
    kwargs = dict()
    kwargs['co'] = airdata_dict['coValue']
    obj = MyModel.objects.create(kwargs)