You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:06:48