Skip to main content
 首页 » 编程设计

python之django View 中的重构/清理时间函数

2024年10月24日40bonelee

我的 Django 应用程序中有以下 View ,效果很好。我对 python/django 很陌生。我想重构它,以便我有一个处理时间编码的函数,我可以调用它,这样我的 View 就不会那么困惑。

@csrf_exempt 
def emulate_create(request): 
    args = json.loads(request.body, object_hook=utils._datetime_decoder) 
    resourceId, count, hours = args['resourceId'], args['count'], args['hours'] 
    now = timezone.now().replace(second=0, microsecond=0) 
    remainder = now.minute % 15 
    delta = (15 - remainder) 
    timeFrom = now + timedelta(minutes=delta) 
    timeTo = timeFrom + timedelta(hours=hours) 
 
    reservation = ReservationProspect(byUser=request.user, forUser=request.user, resource=get_object_or_404(Resource, uuid=resourceId), modality=get_object_or_404(Modality, name="online"), timeFrom=timeFrom, timeTo=timeTo, count=count) 
 
    return HttpResponse(json.dumps([reservation.toDict()], default=utils._datetime_encoder)) 

我该如何重构它?我认为这是应该提取到函数中的部分:

now = timezone.now().replace(second=0, microsecond=0) 
remainder = now.minute % 15 
delta = (15 - remainder) 
timeFrom = now + timedelta(minutes=delta) 
timeTo = timeFrom + timedelta(hours=hours) 

你会怎么做?函数应该返回什么,你会如何调用它?谢谢!

请您参考如下方法:

def time_encode(hours): 
    now = timezone.now().replace(second=0, microsecond=0) 
    remainder = now.minute % 15 
    delta = (15 - remainder) 
    timeFrom = now + timedelta(minutes=delta) 
    timeTo = timeFrom + timedelta(hours=hours) 
    return (timeFrom, timeTo) 

这将是一个很好的起点。该函数返回一个元组(两个结果),可以按以下方式使用。

@csrf_exempt 
def emulate_create(request): 
    args = json.loads( 
        request.body, 
        object_hook=utils._datetime_decoder 
    ) 
    resourceId, count, hours = args['resourceId'], args['count'], args['hours'] 
 
    timeFrom, timeTo = time_encode(hours) 
 
    reservation = ReservationProspect( 
        byUser=request.user, 
        forUser=request.user, 
        resource=get_object_or_404(Resource, uuid=resourceId), 
        modality=get_object_or_404(Modality, name="online"), 
        timeFrom=timeFrom, 
        timeTo=timeTo, 
        count=count 
     ) 
 
    return HttpResponse( 
        json.dumps( 
            [reservation.toDict()], 
            default=utils._datetime_encoder 
        ) 
    )