Django меняет значение BooleanField после истечения срока действия DateField - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы иметь возможность автоматически устанавливать приостановку на False (если, конечно, True), когда end_suspension_date проходит (и, следовательно, если она существует).

models.py

class Profile(models.Model):
    suspended = models.BooleanField(default=False)
    start_suspension_date =  models.DateField(null=True, blank=True)
    end_suspension_date =  models.DateField(null=True, blank=True)
    # ... other fields

Есть ли способ сделать это без сторонних приложений?Я думал об определении функции внутри модели (но я не вижу в этом особого смысла):

def end_suspension(self):
     if date.today() >= self.end_suspension_date:
          self.suspended = False 
          start_suspension_date = None
          end_suspension_date = None
      else:
          # do nothing...

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Нет, вам понадобится что-то вроде сельдерея , чтобы определить задачу, которая фильтрует конец приостановки.

Альтернативный метод, который я предпочитаю, состоит в замене поля suspended свойством, поскольку наличие поля, в котором хранится «пользователь приостановлен», и поля, в котором хранится «когда пользователь больше не приостанавливается», являются избыточными, поскольку мы знать текущую дату.

Более идиоматично будет называть это is_suspended, поэтому:

class Profile(models.Model):

    ...

    @property
    def is_suspended(self):
        return date.today() < self.end_suspension_date

Затем при проверке прав доступа для входа в систему и т. Д. Просто получите доступ profile.is_suspended.

Простое лучше, чем сложное:)

Алди, остерегайтесь часовых поясов. Основное правило: хранить дату UTC вместо локальной даты.

0 голосов
/ 13 ноября 2018

Вы можете попробовать, например:

class Profile(models.Model):
    start_suspension_date =  models.DateField(null=True, blank=True)
    end_suspension_date =  models.DateField(null=True, blank=True)
    # ... other fields

    @property
    def suspended(self):
        return date.today() < self.end_suspension_date
...