【问题标题】:Django change BooleanField value after DateField expiresDateField 过期后 Django 更改 BooleanField 值
【发布时间】:2018-11-12 22:58:43
【问题描述】:

我希望能够在 end_suspension_date 过去时(因此如果它存在)自动将暂停设置为 False(当然,如果是 True)。

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...

【问题讨论】:

    标签: django python-3.6


    【解决方案1】:

    不,您需要celery 之类的内容来定义过滤暂停结束的任务。

    我更喜欢的另一种方法是用属性替换 suspended 字段,因为有一个存储“用户是否被暂停”的字段和一个存储“用户何时不再暂停”的字段是多余的,因为我们知道当前日期。

    更惯用的说法是is_suspended,所以:

    class Profile(models.Model):
    
        ...
    
        @property
        def is_suspended(self):
            return date.today() < self.end_suspension_date
    

    然后在登录视图权限检查等只需访问profile.is_suspended

    简单胜于复杂:)

    Aldi,请注意时区。经验法则:存储 UTC 日期而不是本地日期。

    【讨论】:

    • 副作用是在我的应用程序配置文件中不需要登录,所以如果我每次刷新页面时检查 profile.is_suspended 会增加很多加载时间(例如,如果我有许多个人资料条目)
    • 在数据库读取方面,两种解决方案没有区别:如果使用布尔字段,您仍然需要访问数据库以检查它是真还是假?
    • 也许我可以设置一个每天只调用一次 is_suspended() 的控件......另外感谢 UTC 的建议,我会看看如何(如果我能做到的话)来做更新帖子。
    • 坦率地说,我认为您想多了,并且正处于过早优化的风口浪尖。如果您发现性能问题,请从属性开始并稍后对其进行优化。专业提示:您不会在这里看到性能问题。将时间和精力集中在重要的事情上。
    【解决方案2】:

    你可以试试,比如:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 2020-12-29
      • 2013-10-02
      • 2014-05-21
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2021-10-28
      • 2021-10-03
      相关资源
      最近更新 更多