如何在Django Rest Framework的API视图中覆盖get方法

时间:2019-07-15 07:30:33

标签: python django django-rest-framework django-views

我正在尝试构建一个API视图,该视图根据我作为请求发送的内容从数据库返回一些数据。

我有一个模型BuildingGroup,其中有许多建筑物,其中有许多冷热物体。这些高温和低温物体具有一年的价值。当我发送特定的年份时,我想列出该BuildingGroup中该年份的所有热/冷值。

我认为这应该很简单,但是我不知道我是否朝着正确的方向前进。

我试图像这样覆盖Django APIView的get方法:

class BuildingGroupYearHeatObjects(APIView):

    def get(self, request, pk):
        data = request.data
        year = request.data['year']

        ...here should go more code.....        

        return Response(year)

我在这里遇到关键错误:KeyError: 'year'

我的网址

    path('demand/heat/<int:pk>/',BuildingGroupYearHeatObjects.as_view(),

我的请求:

def test_api_local(method='post', data={}):

    payload = {
        'id' : '1',
        'year' : 2022
    }

    r = requests.request(method, APP_ENDPOINT , json=payload)
    print(r.text)

    return r


test_api_local(method='get', data={ 'id' : 1,
                                 'year' : 2022})

所以我的问题是,我是否真的走对了路,为什么还要得到关键错误?在浏览器中刷新API视图时,只会收到关键错误。但是,如果我发送请求,我不会收到。我猜是因为刷新浏览器时我没有发送一年?

但是我该如何解决呢?

如果有人可以带领我介绍如何在发送年份之后列出热/冷对象?

非常感谢您的帮助。

这是我的模特:

class Building(models.Model):
    name  = models.CharField(max_length=120, null=True, blank=True)


class BuildingGroup(models.Model):
    description           = models.CharField(max_length=500, null=True, blank=True)
    buildings             = models.ManyToManyField(Building, default=None, blank=True)


class DemandBase(models.Model):
    year            = models.PositiveIntegerField(default=default_year())
    demand          = models.FloatField(blank=True, null=True)
    building        = models.ForeignKey(Building, on_delete=models.CASCADE)

 class Meta:
        abstract = True

(DemandBase有两个子类DemandHeat和DemandCool)

1 个答案:

答案 0 :(得分:1)

您收到KeyError异常是因为您试图访问执行postputpatch请求时使用的请求的数据字典

您正在发出get请求,因此无法在请求中发送正文。您可以使用查询url参数,然后通过代码中的请求query_params来访问。

但是我建议您使用过滤,并且您无需自己编写任何复杂的代码。

您只需编写视图,使用rest框架的泛型ListAPIView。您指定查询集和序列化器。

然后查看django-filter程序包(https://django-filter.readthedocs.io/en/master/)。

您可以轻松地为year添加一个过滤器,它将过滤器应用于您的查询集以仅选择选定年份的对象。