【问题标题】:How to change boolean field "isActual" by date如何按日期更改布尔字段“isActual”
【发布时间】:2019-11-14 05:45:18
【问题描述】:

我是 Django Rest 框架的新手。我有这个模型 -

class Post(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    description = models.CharField(verbose_name='description', db_index=True, max_length=64)

在这个模型中,我想添加字段“isActual”,其值等于TrueFalse

如果帖子创建时间超过 1 个月,他的值必须是 False(检查字段“created”)。

我不知道如何创建它。有可能吗?

【问题讨论】:

  • 请不要为此创建字段。定义属性或注释更有意义。否则你会遇到很多“同步”问题。
  • @WillemVanOnsem,谢谢你的回答!你有实现它的想法吗?

标签: django django-rest-framework


【解决方案1】:

首先,创建 BooleanField() 和 像 Answer 这样检查当前时区并尝试一下。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您可以像这样注释查询集:

    from django.utils.timezone import 
    from dateutil.relativedelta import relativedelta
    from django.db.models import BooleanField, Q, Expression
    
    Post.objects.annotate(
        is_actual=ExpressionWrapper(
            Q(created__gte=now() - relativedelta(months=1)),
            output_field=BooleanField()
        )
    )

    由此产生的Post 对象将带有一个额外的属性is_actual,如果帖子不到一个月,则为True,否则为False

    您需要先安装python-dateutil package [PiPy] 才能导入relativedelta [readthedocs.io],其中:

    pip install <b>python-dateutil</b>

    【讨论】:

    • 没用。我确实添加到我的 ViewSet 并且没有任何反应。 queryset = Post.objects.annotate( is_actual=ExpressionWrapper( Q(created__gte=now() - relativedelta(months=1)), output_field=BooleanField() ) ) serializer_class= PostSerializer authentication_classes = (TokenAuthentication, SessionAuthentication, ) filter_backends = (DjangoFilterBackend , )
    • 错误:无法将关键字“created”解析为字段。
    • @TheGreatVY:这通常意味着您的 Post 对象有 no created 字段。
    • 为什么?请检查我的问题。我的模型帖子有“创建”字段。
    • 显然不是,因为该错误意味着它无法找到created 字段。
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 2014-10-02
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多