django - 如何使用从外部站点获取的数据填充 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'。
解决方案
在以下情况下,您的模型方法get_save
应该可以工作:
您确保将 API (
airdata['coValue']
) 接收到的字符串转换为正确的类型,例如co
:self.co = Decimal(airdata['coValue'])
还要注意您的日期是字符串,因此
datetime.datetime
如果要分配它们,则需要将它们更改为正确的。您确保在保存之前设置了所有必填字段(
self.no2
是必需的,因此如果是None
,您的模型将不会保存)。在这种情况下,您应该会看到一个错误。
一种更简单的方法是创建一个包含所有正确值的字典,例如
kwargs['co'] = Decimal(airdata['coValue'])
...
并将其传递给ModelManager
'screate()
方法:
MyModel.objects.create(**kwargs)
确保字典中的所有键都对应于模型的字段。
推荐阅读
- sql-server - IF EXISTS 创建新表和/或列的逻辑
- dart - 为什么我无法定位 SpinKitFadingCircle?
- automation - Telegram bot:如何在私人聊天中为收件人添加按钮
- rust - 对于 `std::error::Error` 和 `#from` 指令,使用 `thiserror::Error` 自动实现 `From` 失败
- apache-spark - pyspark - 将列字符串转换为标题和值
- python - python制作一个打印预览的按钮而不关闭前一个窗口并进入下一个.py
- amazon-web-services - 如何确保 AWS EC2 应用程序是私有且不可访问的
- python - 我在哪里可以找到/从torch生成wav文件
- python - 在一个 Ansible 剧本中安装 Python 后如何收集事实?
- java - grpc java - 迭代 Context.keyValueEntries?