Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用QuerySet获取数据_Python_Django_Django Rest Framework - Fatal编程技术网

Python 使用QuerySet获取数据

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

我正在尝试创建一个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_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()