我已通过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'。
答案 0 :(得分:1)
在以下情况下,您的模型方法get_save
应该有效:
您确保将API(airdata['coValue']
)接收的字符串转换为正确的类型,例如为co
:
self.co = Decimal(airdata['coValue'])
还请注意,您的日期是字符串,因此,如果要分配它们,则需要将其更改为正确的datetime.datetime
。
在保存之前,请确保已设置所有必填字段(必填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)