Как сделать проверку даты в 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 шт):

Автор решения: bolt_py

Вам не нужно ссылаться на отдельный экземпляр модели. Удалите вашу модель 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 это ключ уникальный ключ по которому мы обращаемся к экземпляру модели.

Не уверен что написал всё в точности правильно, но надеюсь что смог передать идею

→ Ссылка
Автор решения: rpe4ka722

Я бы попробовал так:

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 'Продукт годен!

При этом важно отметить что перезапись статуса будет осуществлена только при вызове функции, поэтому если вы хотите чтобы статус вашей модели ежедневно обновлялся необходимо подумать о способе её вызова. Самый простой способ вызывать в представлении, так вам всегда будет показана актуальная информация.

→ Ссылка