Как сделать итерации в моей модели 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)
Вернуться на верх