Я настоятельно советую , а не , чтобы реализовать это с помощью запланированных задач. В любом случае, лучше не использовать поле active
: здесь активна реклама, зависит от starting_date
и expiring_date
. Таким образом, мы можем смоделировать это как:
class AdModel(models.Model):
starting_date = models.DateField()
expiring_date = models.DateField()
Мы можем использовать аннотации, чтобы определить, активен ли AdModel
с:
from django.db.models import BooleanField, ExpressionWrapper, Q
from django.db.models.functions import Now
AdModel.objects.annotate(
active=ExpressionWrapper(
Q(starting_date__lte=Now(), expring_date__gte=Now()),
output_field=BooleanField()
)
)
Если вам это нужно часто, вы можете сделать Manager
, который будет автоматически аннотировать AdModel.objects
:
class <b>AdModelManager</b>(models.Manager):
def get_queryset(self):
return super().get_queryset().annotate(
active=ExpressionWrapper(
Q(starting_date__lte=Now(), expring_date__gte=Now()),
output_field=BooleanField()
)
)
class AdModel(models.Model):
starting_date = models.DateField()
expiring_date = models.DateField()
<b>objects = AdModelManager()</b>
Если вам нужен дополнительный контроль, вы можете просто добавить дополнительное логическое поле Nullable force_active
, которое по умолчанию установлено в NULL, но вы можете установить True
/ False
, чтобы переопределить механизм истечения:
from django.db.models import Coalesce
class AdModelManager(models.Manager):
def get_queryset(self):
return super().get_queryset().annotate(
active=<b>Coalesce('force_activate',</b> ExpressionWrapper(
Q(starting_date__lte=Now(), expring_date__gte=Now()),
output_field=BooleanField()
)<b>)</b>
)
class AdModel(models.Model):
starting_date = models.DateField()
expiring_date = models.DateField()
<b>force_activate</b> = models.BooleanField(null=True)
objects = AdModelManager()