Python 使用QuerySet获取数据
我正在尝试创建一个RESTAPI,它提供特定城市和n天的天气数据。我已经创建了一个指定所有必需字段的模型。我已经使用管理命令填充了数据库 我尝试使用Q方法查询数据库。但我在某处出错,我无法识别Python 使用QuerySet获取数据,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试创建一个RESTAPI,它提供特定城市和n天的天气数据。我已经创建了一个指定所有必需字段的模型。我已经使用管理命令填充了数据库 我尝试使用Q方法查询数据库。但我在某处出错,我无法识别 #views.py from django.shortcuts import render from django.shortcuts import get_object_or_404 from rest_framework.views import APIView from rest_framew
#views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import weatherdata
from .serializers import weatherdataserializer
from django.http import Http404
from django.db.models import Q
# Create your views here.
class weatherList(APIView):
def get(self, request):
weather = weatherdata.objects.all()
serializer = weatherdataserializer(weather, many=True)
return Response(serializer.data)
def post(self, request):
serializer = weatherdataserializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class weatherDetail(APIView):
def get_queryset(self,*args , **kwargs):
queryset_list = weatherdata.objects.all()
query = self.request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(city_name__icontains = query) |
Q(city_id__icontains = query)
).distinct()
return queryset_list
应仅获取过去5天内钦奈的天气。日期时间字段如下:2019-08-12T12:00:00Z,即日期时间。此URL如何映射到您的weatherDetail视图?其中没有GET请求参数q
您的详细信息视图仅基于q参数进行筛选,因此您上面的URL无法返回筛选结果
对于您的URL模式,pk需要是数字,因此它不匹配,但它匹配weatherdata常规列表视图,因为您没有指定$来终止它
将您的URL模式更改为:
url(r'^weatherdata/(?P<city>.+)/(?P<days>[0-9]+)', views.weatherDetail.as_view()
然后在您的视图中,您可以使用kwargs['city']和kwargs['days']来检索URL参数
还要注意,APIView没有get_queryset方法,因此不会调用您的方法。您还需要将其设置为ListAPIView。在序列化程序中,元类字段应该在列表中,但您将它们放在数组中。我认为这可能会解决您的问题。您似乎没有说出哪里出了问题。@DanielRoseman API显示了数据库中存储的所有值。它不仅显示所需的城市。我不知道如何使QuerySet正确工作,但您的URL与您声称的URL不匹配。您说您要访问/weatherdata/Chennai/5,但您的URL只接受/weatherdata/5。同样,你的观点是过滤q值;在哪里提供?你需要始终如一地解释你的问题。我可以稍后修改5,我的第一个任务是显示给定的特定城市。我的意思是,一旦城市被分类,我可以使用同样的逻辑对日期进行排序。我应该如何在url模式中修改url?应该是urlr“^weatherdata/city/”,views.weatherDetail。正如我在回答中所写的那样,请阅读以了解这些url模式的工作原理。我已经链接到1.11文档,因为您显然没有使用Django 2.x
#models.py
from django.db import models
# Create your models here.
from django.db import models
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)
def __str__(self):
return self.city_name
#urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets
# Serializers define the API representation.
from importweather import views
from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^weatherdata', views.weatherList.as_view()),
url(r'^weatherdata/(?P<pk>[0-9]+)/', views.weatherDetail.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
url(r'^weatherdata/(?P<city>.+)/(?P<days>[0-9]+)', views.weatherDetail.as_view()