python - 如何在 Django Rest Framework 的 API 视图中覆盖 get 方法
问题描述
我正在尝试构建一个 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)
解决方案
您收到KeyError
异常是因为您试图访问请求时使用的请求的数据字典post
,put
,patch
请求。
您正在提出get
请求,因此您无法在请求中发送正文。您可以使用查询 url 参数,然后通过query_params
代码中的请求访问。
但我建议您使用过滤,您不需要自己编写任何复杂的代码。
您只需编写视图,使用休息框架的泛型ListAPIView
。您指定查询集和序列化程序。
然后查看django-filter
包(https://django-filter.readthedocs.io/en/master/)。
您可以轻松地添加过滤器,year
它将在您的查询集上应用过滤器以仅选择选定年份的对象。
推荐阅读
- git - Azure 函数定义源控件
- regex - 在记事本++中,您可以替换匹配组中的字符吗
- c# - 嵌入在 Outlook 中的 WPF 控件缺少退格键和空格键
- python - 在python中将json转换为数据框
- windows - Ghostscript 打印空白页
- javascript - 当我决定调用它时,我需要强制在 vimeo 的视频中播放事件
- javascript - 打字稿源解析:获取与某些反应类相关的接口
- vba - 如果范围 A 值不等于任何范围 D 值,则将范围 A 值添加到范围 D
- html - 在 VS Code 中创建自定义 HTML 片段
- scala - 如何创建异常查询以跳过更新 DB (Scala) 中的 None 值