Как вы их реализуете, зависит от того, как вы обрабатываете связанные данные.
is_new
вам нужна дата создания. is_hot
вам нужен связанный счетчик проданных товаров и значение для сравнения тоже, например hot_threshold_count или что-то в этом роде. is_promo
вы, вероятно, хотите, чтобы это было связано с деталями продвижения.
Вот примерный набросок того, как бы я справился с этим:
from django.utils import timezone
from django.conf import settings
class Product(models.Model):
... # name, etc
creation_datetime = models.Datetime(auto_add_now=True)
sold_count = models.Integer(default=0)
@property
def is_hot(self) -> bool:
return self.sold_count >= settings.HOT_COUNT_THRESHOLD
@property
def is_new(self) -> bool:
elapsed_days = (timezone.now() - self.creation_datetime).days
return elapsed_days <= settings.MAX_NEW_DAYS
@property
def is_promo(self) -> bool:
has_promos = bool(Promotion.objects.filter(product=self).count())
return has_promos
class Promotion(models.Model):
creation_datetime = models.Datetime(auto_add_now=True)
product = models.ForeignKey(Product)
discount_percentage = models.Float()
ГДЕ: settings.MAX_NEW_DAYS - это объект timedelta