我正在制作一个API模块,该模块通过运行一个Django管理命令将天气数据保存到我的Django数据库中,该命令从源API重试所有数据。我创建了一个具有所有必需数据类型的“天气数据”模型。我写了一个管理命令,可以直接将数据保存到数据库中。
管理命令和models.py的片段如下所示。
def handle(self,*args,**kwargs):
for city in input_file:
city_name = city.strip()
print(city_name)
full_api_url = api + city_name + '&mode=json&units=' + unit + '&APPID=' + user_api
full_wet_url = weather_api + city_name + '&mode=json&units=' + unit + '&APPID=' + user_api
try:
data = requests.get(full_api_url).json()
dta = requests.get(full_wet_url).json()
city_id = dta["id"]
longitude = dta["coord"]["lon"]
latitude= dta["coord"]["lat"]
for dt in data["list"]:
temp = dt["main"]["temp"]
temp_min = dt["main"]["temp_min"]
temp_max = dt["main"]["temp_max"]
pressure = dt["main"]["pressure"]
sea_level = dt["main"]["sea_level"]
grnd_level = dt["main"]["grnd_level"]
humidity = dt["main"]["humidity"]
weather = dt["weather"][0]
main = weather["main"]
description = weather["description"]
clouds = dt["clouds"]["all"]
wind_speed = dt["wind"]["speed"]
wind_deg = dt["wind"]["deg"]
dt_txt = dt["dt_txt"]
wd = weatherdata(city_name,city_id,latitude,longitude,dt_txt,temp,temp_min,temp_max,pressure,sea_level,grnd_level,humidity,main,description,clouds,wind_speed,wind_deg).save()
print ("Success")
except Exception as e:
print (e)
pass
class weatherdata(models.Model):
city_name = models.CharField(max_length = 80)
city_id = models.IntegerField(default=0)
latitude = models.FloatField(null=True , blank=True)
longitude = models.FloatField(null=True , blank=True)
dt_txt = models.DateTimeField()
temp = models.FloatField(null = False)
temp_min = models.FloatField(null = False)
temp_max = models.FloatField(null = False)
pressure = models.FloatField(null = False)
sea_level = models.FloatField(null = False)
grnd_level = models.FloatField(null = False)
humidity = models.FloatField(null = False)
main = models.CharField(max_length=200)
description = models.CharField(max_length=30)
clouds = models.IntegerField(null=False)
wind_speed = models.FloatField(null = False)
wind_degree = models.FloatField(null = False)
如果我尝试执行“ python manage.py theweather”(天气是管理命令文件的名称),则会出现错误,指出:
nantapur
invalid literal for int() with base 10: 'Anantapur'
Chittoor
invalid literal for int() with base 10: 'Chittoor'
Kakinada
invalid literal for int() with base 10: 'Kakinada'
对于quarters.csv文件中的所有城市名称。 该错误的解决方法是什么?
答案 0 :(得分:0)
您应该使用命名参数,使用位置参数是“不稳定的”,因为如果以后添加一些字段,则可能会出错。请注意,这里的第一个参数是隐式主键:
wd = weatherdata.objects.create(
city_name=city_name,
city_id=city_id,
latitude=latitude,
longitude=longitude,
dt_txt=dt_txt,
temp=temp,
temp_min=temp_min,
temp_max=temp_max,
pressure=pressure,
sea_level=sea_level,
grnd_level=grnd_level,
humidity=humidity,
main=main,
description=description,
clouds=clouds,
wind_speed=wind_speed,
wind_deg=wind_deg
)
话虽这么说,但我不确定这里的建模是否良好,它包含大量数据重复。
请注意,类名通常用CamelCase
编写,因此应为WeatherData
,而不是 。。 >
weatherdata