0

I'm trying something like a story FB apps. I don't know how to how to change BooleanField value after X days?

class Story(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    title = models.CharField(max_length=200, unique=True)
    image = models.ImageField(upload_to='story/')
    created_on = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    
    def __str__(self):
        return self.title
    
    @property
    def is_active(self):
        if self.created_on < #(self.created_on + 2 days)#
            return False
        return True
Louis
  • 360
  • 2
  • 12

1 Answers1

1
class Story(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, unique=True)
    image = models.ImageField(upload_to='story/')
    created_on = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    @property
    def is_active(self):
        if (self.created_on + timedelta(days=2)) > datetime.now():  # (self.created_on + 2 days)#
            return False
        return True

Or better yet:

class Story(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, unique=True)
    image = models.ImageField(upload_to='story/')
    created_on = models.DateTimeField(auto_now_add=True)
    active_until = models.DateTimeField()

    def __str__(self):
        return self.title

    @property
    def is_active(self):
        return self.active_until >= datetime.now()

So the lesson is that you don't need to update database after a time. Rather, it's better to structure your models so they are stateless and don't need to be updated. There should only be a "is_active" boolean field on this model if you want to be able to manually toggle this story on and off.

Dellkan
  • 1,861
  • 11
  • 15
  • I reached it but there is something wrong can't compare offset-naive and offset-aware datetimes – Louis Sep 11 '20 at 13:08
  • Try replacing datetime.now() from my answer with timezone.now() (`django.utils.timezone.now`) See https://stackoverflow.com/a/10653144/2923245 for more details – Dellkan Sep 11 '20 at 13:12