Как рассчитать год выхода на пенсию персонала - PullRequest
0 голосов
/ 07 февраля 2020

Я создаю приложение для работы с персоналом, используя python с Django, у меня возникла проблема с расчетным годом выхода на пенсию сотрудника, например, если сотрудник вводит дату своего рождения, пусть система рассчитает его / ее выход на пенсию год или сколько лет осталось на пенсию. сотрудники уходят на пенсию в 60 лет

Получаю эту ошибку:

TypeError at /staffprofile/profile_entry/
unsupported operand type(s) for -: 'datetime.date' and 'datetime.datetime'
Request Method: POST
Request URL:    http://0.0.0.0:8080/staffprofile/profile_entry/
Django Version: 1.8
Exception Type: TypeError
Exception Value:    
unsupported operand type(s) for -: 'datetime.date' and 'datetime.datetime'
Exception Location: /home/bakceesay/djangoapps/NAO/venv/src/staffprofile/views.py in profile_entry, line 57

это мой код в views.py

from __future__ import unicode_literals
from django.shortcuts import get_object_or_404, render, redirect
from django.contrib.auth.models import User
from django.http import HttpResponse, HttpResponseRedirect # HttpResponse allows the get_absolute_url to work ## and HttpresponseRedirect redirects page after a process
from .models import *
from .forms import *
from django.contrib import messages
from datetime import datetime,  timedelta


def profile_entry(request):
        title = 'ADD YOUR PROFILE INFORMATION'
        form = ProfileForm(request.POST or None, request.FILES or None) 
        if form.is_valid():
            instance = form.save(commit=False)
            date_of_birth = instance.date_of_birth

            age_days = (datetime.now().date() - date_of_birth)
            age = (age_days/365)


            rem_yrs = (60 - int(age))

            instance.date_of_retirement = rem_yrs
            instance.save()
            messages.success(request, 'Successfully Saved')
            return redirect('/profile/profile_detail')
        context = {
            "title": title,
            "form": form,
         }
        return render(request, "profile_entry.html",context)

models.py

[address = models.CharField(max_length=30, blank=True, null=True)
date_of_birth = models.DateTimeField(blank=True, null=True)
email_address = models.CharField(max_length=30, blank=True, null=True)
phone_number = models.CharField(max_length=30, blank=True, null=True)
date_of_hire = models.DateTimeField(blank=True, null=True)
date_of_termination = models.DateField(blank=True, null=True)
date_of_retirement = models.CharField(max_length=30, blank=True, null=True)][1]  

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

В то время как вам сказали в комментариях, что это не лучший способ продолжить, я постараюсь ответить на этот вопрос -

Как добавить поле 60 лет к дате?

вы можете использовать относительная дельта (для учета разницы дня високосных лет):

from dateutil.relativedelta import relativedelta
...
ret_age = instance.date_of_birth + relativedelta(years=60)
ret_days = ret_age.days

Также убедитесь, что вы знаете о tz в курсе datetime.

0 голосов
/ 07 февраля 2020

Вы определенно начинаете это с получения объекта datetime как для текущего дня, так и для их дня рождения. Создайте объект выхода на пенсию следующим образом:

retirement = date_of_birth.replace(year=date_of_birth.year+60)

И затем получите год выхода на пенсию, получив свойство

retirement.year

Наконец, получите оставшиеся годы на

retirement.year-datetime.now().date().year

Я бы не взял разницу в днях и разделил бы на 365 из-за високосных лет. Этот метод, однако, округляет текущий возраст человека, и никакие доли года не будут существовать. Если вы хотите большей точности, я бы добавил в месяцах, а не в долях года. Просто используйте атрибут .month для datetime, если вы хотите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...