如何在Django中使用表达式进行过滤

3
我想要一个实现这个“伪代码”的过滤器:
   Post.objects.filter(Post.timestamp + Post.duration > datetime.datetime.now())

我也希望将其包装在Django管理命令中。如果有任何帮助,那就太好了!

你需要先研究如何编写过滤查询;那不是有效的Django。 - Daniel Roseman
我尝试自己解决这个问题。我找到了这份文档:https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/。我发现了一些错误,但没有找到解决方案。我真的很需要帮助! - Kaesekante
1个回答

7

筛选器

不确定你的字段长什么样子,这里有个提示:

让我们编写一个像这样的F表达式F('timestamp') - F('duration'),并使用它来注释我们的查询:

from django.db.models import DateTimeField, ExpressionWrapper, F

Post.objects.annotate(
        timestamp_minus_duration=ExpressionWrapper(
            F('timestamp') + F('duration'),
            output_field=DateTimeField()
        )
    )

现在,您可以使用已注释的字段进行筛选。
   Post.objects.annotate(
        timestamp_minus_duration=ExpressionWrapper(
            F('timestamp') + F('duration'),
            output_field=DateTimeField()
        )
    ).filter(
        timestamp_minus_duration__gt=datetime.datetime.now()
    )

管理命令

只需将代码放入命令的handle()方法中。

参考:https://docs.djangoproject.com/en/1.9/topics/db/queries/#using-f-expressions-in-filters

参考:https://docs.djangoproject.com/es/1.9/ref/models/expressions/#using-f-with-annotations

参考:https://docs.djangoproject.com/es/1.9/topics/db/aggregation/#filtering-on-annotations

# yourapp/management/commands/deletepost.py

from django.core.management.base import BaseCommand, CommandError
from yourapp.models import Post

class Command(BaseCommand):
    help = 'Describe your cmd here'

    def handle(self, *args, **options):
           Post.objects.annotate(...).filter(...).delete()

更多细节请参考:https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/

你能给我一个筛选的提示吗?基本思路是,时间戳是创建日期,用户可以选择帖子的持续时间。时间戳来自DateTimeField,持续时间来自Durationfield的元组。 - Kaesekante
我发布了一些提示,使用F表达式注释值,然后通过它进行过滤,这应该可以解决问题。如果你遇到问题,请发布你的模型字段,明天我会为你编写实际代码! - bakkal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接