Как добавить определенное количество дней к дате, используя python - timedelta?
Я столкнулся с проблемой. В принципе, мне нужно добавить, в зависимости от типа длительности, определенное количество дней к дате. Моя модель и функции выглядят следующим образом:
models.py
from django.db import models
import datetime
# Create your models here.
FRAZIONAMENTO = (
('Annuale', 'Annuale'),
('Semestrale', 'Semestrale'),
('Quadrimestrale', 'Quadrimestrale'),
('Mensile', 'Mensile'),
)
class Polizza(models.Model):
cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE)
numero_polizza = models.CharField(max_length=100)
data_decorrenza = models.DateField()
data_scadenza = models.DateField(blank=True, null=True)
ramo_polizza = models.CharField(max_length=100, choices=RAMO_POLIZZA)
polizza_nuova = models.BooleanField(default=True)
frazionamento = models.CharField(max_length=100, choices=FRAZIONAMENTO)
premio = models.DecimalField(max_digits=5, decimal_places=2)
provvigione = models.DecimalField(
max_digits=7, decimal_places=2, null=True, blank=True)
creata = models.DateTimeField(auto_now_add=True)
aggiornata = models.DateTimeField(auto_now=True)
class Meta:
verbose_name_plural = 'Polizza'
ordering = ['data_scadenza']
def __str__(self):
return self.ramo_polizza + ' ' + self.frazionamento
@property
def get_data_scadenza(self):
if self.frazionamento == 'Annuale':
data_scadenza = self.data_decorrenza + \
str(datetime.timedelta(days=365))
elif self.frazionamento == 'Semestrale':
data_scadenza = self.data_decorrenza + \
str(datetime.timedelta(days=180))
elif self.frazionamento == 'Quadrimestrale':
data_scadenza = self.data_decorrenza + \
str(datetime.timedelta(days=120))
elif self.frazionamento == 'Mensile':
data_scadenza = self.data_decorrenza + \
str(datetime.timedelta(days=30))
return data_scadenza
def save(self, *args, **kwargs):
self.provvigione = self.get_provvigione
super(Polizza, self).save(*args, **kwargs)
views.py
def nuova_polizza(request):
clienti = Cliente.objects.all()
polizze = Polizza.objects.all()
context = {
'clienti': clienti,
'polizze': polizze,
}
return render(request, 'anagrafica/nuova_polizza.html', context)
def salva_nuova_polizza(request):
if request.method == 'POST':
cliente = request.POST.get('cliente')
numero_polizza = request.POST.get('numero_polizza')
data_decorrenza = request.POST.get('data_decorrenza')
ramo_polizza = request.POST.get('ramo_polizza')
frazionamento = request.POST.get('frazionamento')
premio = int(request.POST.get('premio'))
polizza = Polizza(cliente_id=cliente, numero_polizza=numero_polizza, data_decorrenza=data_decorrenza,
ramo_polizza=ramo_polizza, frazionamento=frazionamento, premio=premio)
polizza.save()
return HttpResponseRedirect(reverse('anagrafica:lista_clienti'))
else:
return HttpResponse('Metodo non Consentito')
Он возвращает мне эту ошибку:
django.core.exceptions.ValidationError: ['“2022-01-01120 days, 0:00:00” value has an invalid date format. It must be in YYYY-MM-DD format.']
Я знаю, что это, вероятно, какая-то крошечная ошибка, но я не смог ее найти. Любая помощь будет высоко оценена.
Как видно из сообщения об ошибке, вы объединяете строки:
data_scadenza = self.data_decorrenza + \
str(datetime.timedelta(days=30))
Попробуйте это:
data_scadenza = self.data_decorrenza + \
datetime.timedelta(days=30)
В конце концов я нашел решение, которое заключается в следующем: models.py
@property
def get_data_scadenza(self):
data_decorrenza = dt.strptime(self.data_decorrenza, '%Y-%m-%d')
if self.frazionamento == 'Annuale':
data_scadenza = data_decorrenza + timedelta(days=365)
elif self.frazionamento == 'Semestrale':
data_scadenza = data_decorrenza + timedelta(days=180)
elif self.frazionamento == 'Quadrimestrale':
data_scadenza = data_decorrenza + timedelta(days=120)
elif self.frazionamento == 'Mensile':
data_scadenza = data_decorrenza + timedelta(days=30)
return data_scadenza
Теперь все работает отлично!!!