Как сделать проверку даты в Django
`
class MakeStatus(models.Model):
pass
class Card(models.Model):
serial_num = models.IntegerField(unique=True)
number_card = models.IntegerField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True)
end_date = models.ForeignKey('MakeStatus', on_delete=models.PROTECT)
amount = models.IntegerField()
status = models.ForeignKey('MakeStatus', on_delete=models.PROTECT)
`
Нужно засунуть проверку в Makestatus, которая будет проверять истек ли срок годности в переменной end_date, и если не истек status='Срок годности не истек', а иначе status='Срок годности истек'. Как реализовать данный функционал?
Ответы (2 шт):
Вам не нужно ссылаться на отдельный экземпляр модели. Удалите вашу модель MakeStatus и переопределите поля модели Card следующим образом:
class Card(models.Model):
serial_num = models.IntegerField(unique=True)
number_card = models.IntegerField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True)
end_date = models.IntegerField()
amount = models.IntegerField()
Для того чтобы узнать истёк ли срок годности товара, достаточно создать представление, которое сравнивает разницу текущей даты со значением поля created_at:
from path_to_your_models.py_file import Card
from dateutil import parser
def compare(request, cid):
is_alive = True
template = 'your_template'
card = Card.objects.get(id=cid)
time = parser.parse(card.created_at)
if (datetime.now() - time).days > card:
is_alive = False
return render(request, template, {'is_alive': is_alive})
cid это ключ уникальный ключ по которому мы обращаемся к экземпляру модели.
Не уверен что написал всё в точности правильно, но надеюсь что смог передать идею
Я бы попробовал так:
class Card(models.Model):
serial_num = models.IntegerField(unique=True)
number_card = models.IntegerField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True)
end_date = models.DateTimeField()
amount = models.IntegerField()
status = models.BooleanField(default=True, verbose_name='Годен ли продукт')
def is_status(self):
if end_date <= datetime.today():
self.status = False
self.save()
return 'Продукт просрочен!'
else:
return 'Продукт годен!
При этом важно отметить что перезапись статуса будет осуществлена только при вызове функции, поэтому если вы хотите чтобы статус вашей модели ежедневно обновлялся необходимо подумать о способе её вызова. Самый простой способ вызывать в представлении, так вам всегда будет показана актуальная информация.