2014-12-21 2 views
1

Я новичок, и я пытаюсь создать функцию, которая проверяет, чтобы проверить истечение срока действия листинга. Если он истек, я хочу in_progress booleanfield = False.django check post expiry function

Какие у меня варианты? Я не мог найти разумного способа сделать это. Пожалуйста помоги.

class Post(models.Model): 

    title = models.CharField(max_length=120) 
    description = models.CharField(max_length=300) 
    in_progress = models.BooleanField(default=True) 

    created_at = models.DateTimeField(auto_now=False, auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True, auto_now_add=False) 
    expiration_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True) 
    duration = models.PositiveIntegerField(default=15) 

ответ

1

Непонятно, что именно вы хотите сделать. Из Вашего вопроса, я понимаю, что может быть:

  1. Вы хотите добавить метод на экземпляре, который установлен in_progress в False приведены некоторые условия?
  2. Вы хотите сделать функцию, которая проходит через все Post объекты и комплекты in_progress по False тем, которые соответствуют определенным условиям?
  3. Вы хотите сделать такую ​​функцию и периодически ее запускать?
  4. Вы хотите, чтобы некоторые условия были проверены в определенные моменты (загрузка объекта/сохранение объекта) и обновление in_progress в зависимости от того?
  5. На самом деле вам необязательно иметь поле in_progress, и вы можете настроить свойство только для чтения, которое возвращает True или False, исходя из некоторых условий?

Самый простой вариант, если вам не нужно, чтобы быть в состоянии сделать DB запрос на поле, чтобы просто удалить его полностью, и пусть это будет вычисленное свойство, например:

@property 
def in_progress(self): 
    return self.expiration_date > timezone.now() 

(временной зоной является модуль django.utils.timezone)

+0

Привет, я хотел, чтобы он мог постоянно проверять, что он будет скрывать сообщение после in_progress = False, в основном я хочу, чтобы сообщение существовало в течение определенного периода времени. –

+0

Хорошо. Вам нужно иметь возможность запросить его? Например, вам нужно сделать «Post.objects».filter (in_progress = True) ', или это нормально делать' Post.objects.filter (expiration_date__gt = timezone.now()) '? – spectras

+0

Да, было бы лучше разобраться во всех неактивных сообщениях. –

0

Таким образом, проблема заключается в том, что in_progress - действительно вычисленное значение. Для целей этого ответа я собираюсь предположить, что in_progress зависит от даты истечения срока действия и текущей даты. Если текущая дата находится после истечения срока действия, то срок действия истек и больше не выполняется.

Так что, учитывая, что in_progress зависит от того, что всегда известно, но не находится в БД, я собираюсь предположить, что вы не помещаете in_progress в базу данных, а просто вычисляете его во время выполнения. Вы можете добавить метод в класс Post, называемый in_progress, и он может вычислить значение in_progress при его вызове (т. Е. Когда кто-то делает запрос).

1

Я верю, что что-то подобное будет работать на вас, хотя я не проверял его, поэтому может быть опечатка.

Таким образом, ситуация такова, каждый раз, когда сообщение добавляется или обновляется, метод save вызывается. тот же метод имеет некоторую логику, которая будет определять, превышает ли дата, чем сегодня, чем срок ее действия, поэтому установите значение False. Эта логика может быть любой логикой даты, которую необходимо провести, чтобы проверить, истек ли срок или нет.

Django имеет встроенный метод Save, который вызывается во всех его объектах модели, когда они записываются в базу данных. Этот код ниже является примером того, как вы переопределяете этот метод сохранения для объекта класса.

class Post(models.Model): 

    title = models.CharField(max_length=120) 
    description = models.CharField(max_length=300) 
    in_progress = models.BooleanField(default=True) 

    created_at = models.DateTimeField(auto_now=False, auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True, auto_now_add=False) 
    expiration_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True) 
    duration = models.PositiveIntegerField(default=15) 

    def save(self, *args, **kw): 
      ## your custom date logic to verify if expired or not. 
      if self.expiration_date < datetime.datetime.now().date(): 
       self.in_progress = False 
      super(Post, self).save(*args, **kw) 
+1

Привет, спасибо за ваш ответ. –

+0

Это работает, но есть ли еще один способ проверить его постоянно, чтобы узнать, истекает ли оно? Я хотел, чтобы он спрятался один раз in_progress = False –