在Django1.11+DRF中,如何编写计算total_days的POST接口?
如何用Django 1.11和DRF实现计算请假天数的POST接口
嘿,我来帮你搞定这个需求!你已经有了带total_days属性的Leave模型,现在要做一个POST接口接收start_date和return_date,返回计算后的天数,用Django 1.11和REST Framework的话可以这么一步步来:
第一步:确认你的Leave模型(补全缺失部分)
首先先把你的Leave模型补全完整,确保包含start_date、return_date字段和total_days属性(我帮你补了合理的实现,你可以根据实际需求调整):
from django.db import models from django.contrib.auth.models import User from datetime import timedelta class Leave(models.Model): LEAVE_STATUS = ( ('A', 'Approved'), ('R', 'Rejected'), ('P', 'Pending'), ) leave_id = models.AutoField(primary_key=True) applicant = models.ForeignKey(User, related_name='leaves', on_delete=models.CASCADE) start_date = models.DateField() return_date = models.DateField() status = models.CharField(max_length=1, choices=LEAVE_STATUS, default='P') @property def total_days(self): # 计算两个日期之间的天数(包含开始和结束当天) delta = self.return_date - self.start_date return delta.days + 1
第二步:创建序列化器验证输入参数
我们需要一个序列化器来接收并验证请求里的start_date和return_date,因为不需要操作数据库,直接用Serializer基类就行:
# 在你的app目录下创建serializers.py from rest_framework import serializers class LeaveDaysCalculationSerializer(serializers.Serializer): start_date = serializers.DateField(required=True) return_date = serializers.DateField(required=True) def validate(self, data): # 额外验证:返回日期不能早于开始日期 if data['return_date'] < data['start_date']: raise serializers.ValidationError("返回日期不能早于开始日期") return data
第三步:编写视图处理POST请求
接下来在views.py里写一个视图类,处理POST请求,复用Leave模型的total_days逻辑(不用创建实际的数据库记录,构造临时实例就行):
# views.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .serializers import LeaveDaysCalculationSerializer from .models import Leave class CalculateLeaveDaysView(APIView): def post(self, request): # 验证请求数据 serializer = LeaveDaysCalculationSerializer(data=request.data) if serializer.is_valid(): # 构造临时的Leave实例,复用total_days计算逻辑 temp_leave = Leave( start_date=serializer.validated_data['start_date'], return_date=serializer.validated_data['return_date'] ) # 获取计算后的天数 total_days = temp_leave.total_days # 返回结果 return Response({'total_days': total_days}, status=status.HTTP_200_OK) # 验证失败返回错误信息 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
第四步:配置URL路由
把视图映射到一个URL路径上,在你的app的urls.py里添加:
from django.conf.urls import url from .views import CalculateLeaveDaysView urlpatterns = [ # 其他URL... url(r'^calculate-leave-days/$', CalculateLeaveDaysView.as_view(), name='calculate_leave_days'), ]
测试接口
现在你可以用curl或者Postman来测试这个接口了,比如用curl:
curl -X POST -H "Content-Type: application/json" -d '{"start_date": "2024-05-01", "return_date": "2024-05-05"}' http://localhost:8000/calculate-leave-days/
正常情况下会返回:
{"total_days": 5}
这样就搞定啦!这种方式的好处是完全复用了你已经写好的total_days计算逻辑,不用重复写代码,保持了代码的一致性。
内容的提问来源于stack exchange,提问作者Philip Mutua
相关产品推荐
相关产品推荐

