Как сделать итерации в моей модели django, чтобы иметь возможность генерировать информацию о погоде для каждого города? База данных показывает информацию только для первого названия города.
Примечание: Вывод информации о погоде не содержит информации для всех названий городов после итерации. Он возвращает информацию только для первого названия города в базе данных.
Примечание: Вывод информации о погоде не содержит информации для всех названий городов после итерации. Он возвращает информацию только для первого названия города в базе данных.
models.py from django.db import models из pytz import timezone
# Create your models here.
class city(models.Model):
name=models.CharField(max_length=40)
def __str__(self):
return self.name
class weather(models.Model):
City=models.ForeignKey(city, null=True, on_delete=models.CASCADE)
country=models.CharField(max_length=40)
timezone=models.CharField(max_length=40)
temperature=models.FloatField()
humidity=models.FloatField()
status=models.CharField(max_length=40)
def __str__(self):
return self.country
serializers.py
from rest_framework import serializers
from .models import weather,city
class CitySerializers(serializers.ModelSerializer):
class Meta:
model=city
fields='__all__'
class WeatherSerializers(serializers.ModelSerializer):
class Meta:
model=weather
fields='__all__'
views.py
from django.shortcuts import render
import requests
from .models import weather,city
from .serializers import WeatherSerializers
from rest_framework.decorators import api_view
from rest_framework.response import Response
from geopy.geocoders import Nominatim
# Create your views here.
@api_view(['GET'])
def weatherinfo(request):
Cit=city.objects.all()
geolocator=Nominatim(user_agent="christopherleon237@gmail.com")
key= '1824949f0261346c55b64d82f091072a'
for obj in Cit:
#cit=city.objects.get(city,id=obj)
location=geolocator.geocode(obj)
coordinates=(location.latitude,location.longitude)
lat=coordinates[0]
long=coordinates[1]
url='https://api.openweathermap.org/data/2.5/weather?lat={}&lon=
{}&appid={}'.format(lat,long,key)
city_weather=requests.get(url).json()
weather_data=weather.objects.create(
City=obj,
country=city_weather['sys']['country'],
timezone=city_weather['timezone'],
temperature=city_weather["main"]["temp_max"],
humidity=city_weather["main"]["humidity"],
status=city_weather["weather"][0]["description"],
)
serializer=WeatherSerializers(weather_data, many=False)
return Response(serializer.data)
Примечание: Вывод информации о погоде не содержит информации для всех названий городов после итерации. Он возвращает информацию только для первого названия города в базе данных.
В цикле for вы возвращаете данные о первом городе и погоде. После возврата чего-либо цикл завершается.
@api_view(['GET'])
def weatherinfo(request):
# ... your code
for obj in Cit:
# ... your code
serializer=WeatherSerializers(weather_data, many=False)
return Response(serializer.data) # <- this will break/stop the for loop
Вместо этого вы должны написать что-то вроде (пожалуйста, рассматривайте это только как черновик; это может не работать как copy'n'paste)
@api_view(['GET'])
def weatherinfo(request):
# ... your code
weather_data_results = []
for obj in Cit:
# ... your code
serializer=WeatherSerializers(weather_data, many=False)
weather_data_results.append(serializer.data)
return Response(weather_data_results)