python - (Django) 将 POST ID 发送回客户端
问题描述
我是 Django 新手,我正在尝试创建一个基本的 API。但是一直困扰我的一件事是如何为某些(异步)事件发生时创建回调函数。
例如,我最简单的情况之一是客户端发送 POST 请求。我想将DB 中该请求的 ID 发回给他。我该怎么做?
我的代码主要遵循 William S. Vincent 的Django for APIs书,稍作修改。
最重要的部分是:
models.py
:
from django.db import models
class SegmentcliApi(models.Model):
request_id = models.AutoField(primary_key = True)
database = models.CharField(max_length = 100)
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
def __str__(self):
return f'DB Request to {self.database}: created at {self.created_at}'
serializers.py
:
from rest_framework import serializers
from .models import SegmentcliApi
class SegmentcliApiSerializer(serializers.ModelSerializer):
class Meta:
fields = (
'request_id',
'database',
'created_at',
'updated_at',
)
model = SegmentcliApi
views.py
:
from rest_framework import generics
from .models import SegmentcliApi
from .serializers import SegmentcliApiSerializer
class SegmentcliApiList(generics.ListCreateAPIView):
queryset = SegmentcliApi.objects.all()
serializer_class = SegmentcliApiSerializer
class SegmentcliApiDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = SegmentcliApi.objects.all()
serializer_class = SegmentcliApiSerializer
解决方案
在您的views.py
,更具体地说,在CreateApiView
orListCreateApiView
类中,您可以覆盖该create
方法,以便您可以从发布请求中获得特定的响应。
该create
方法来自CreateModelMixin
类,该类由 继承,而该类ListCreateAPIView
又由您的特定 Django 模型继承。
所以请按照以下步骤操作:
from rest_framework import status
from rest_framework.response import Response
class SegmentcliApiList(generics.ListCreateAPIView):
queryset = SegmentcliApi.objects.all()
serializer_class = SegmentcliApiSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
# Original Response (inside the `CreateModelMixin` class)
# return Response(
# serializer.data,
# status=status.HTTP_201_CREATED,
# headers=headers
# )
# We will replace the original response with this line
return Response(
{'id': serializer.data.get('request_id')},
status=status.HTTP_201_CREATED,
headers=headers
)
# serailizer.data is the created object in a JSON format
这对我有用。如果它不适合你,请告诉我你在评论中得到了什么。如果它对您有用,请接受答案。
推荐阅读
- css - 将背景图像 image_tag 添加到 div
- node.js - Nodejs跟随系统无法正常工作
- flutter - Flutter:如何使小部件在几秒钟后消失?
- github - 带有 Sphinx 生成文档的 Github 页面无法正确显示 HTML
- unity3d - 无法输入 Unity Inspector
- r - 如果列中出现负值,如何复制列?
- java - org.springframework.beans.factory.BeanCreationException:创建名为“flywayInitializer”的bean时出错
- node.js - 为什么我的 sinon 存根表现得像在调用真正的函数?
- javascript - Highcharts arearange 图不尊重“connectEnds”选项
- c++ - c++中的显式比较