我是Django的新手,正在尝试创建一些基本的API。但是困扰我的一件事是如何为某些(异步)事件发生时创建回调函数。
例如,我最简单的情况之一是客户端发送POST请求的情况。我想发回给他数据库中那个请求的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
答案 0 :(得分:1)
我建议开始研究Django Forms,尤其是Model Form,这就是我认为SegmentcliApiSerializer
应该的样子。然后,我不确定如何将urls.py
设置为可与您的应用一起使用,但是在您的模板中,表单将类似于:
<form action="{% url 'name_of_your_url_to_get_to_view_method' %}" method="POST">
{% csrf_token %}
{{ form }}
<button type="submit">BUTTON</button>
</form>
和view.py
将是这样的:
def yourViewMethod(request):
if(request.method == "POST"):
form = SegmentcliApiSerializer(request.POST)
if(form.is_valid()):
form.save()
savedId = request.POST.get("request_id")
return render(request, "yourFolder/yourHtmlFile.html", {"savedId": savedId})
else:
form = SegmentcliApiSerializer()
return render(request, "yourFolder/yourHtmlFile.html", {"form": form})
然后,无论yourHtmlFile.html
是什么,您都可以使用
{{ savedId }}
显示它的地方。我想这就是你要问的。
编辑:已修复,因此可以正确获取值。
答案 1 :(得分:1)
我无法发表评论,因为我没有足够的声誉,但是关于@marsonfire的答案,如果您只想使用简单的JSON响应,则可以使用JsonResponse而不是render
。
因此,您会遇到类似return JsonResponse({"savedId": savedId})
答案 2 :(得分:1)
在您的views.py
中,更具体地说,在CreateApiView
或ListCreateApiView
类中,您可以覆盖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
这对我有用。如果对您不起作用,请告诉我您的评论。如果它适合您,请接受答案。