首页 > 解决方案 > (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

标签: pythondjangodjango-rest-framework

解决方案


在您的views.py,更具体地说,在CreateApiVieworListCreateApiView类中,您可以覆盖该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 

这对我有用。如果它不适合你,请告诉我你在评论中得到了什么。如果它对您有用,请接受答案。


推荐阅读