Django - 过滤超过X天的对象

时间:2016-11-15 18:37:47

标签: python django

我需要过滤超过postData(json: PortfolioVO) { var njson = JSON.stringify(json); var headers = new Headers({ 'Content-type': 'application/json;charset=UTF-8', 'Accept': 'application/json' }); return this.http .post('http://www.develop.nivafex.com/rest/portfolios/en', njson, { headers: headers }) .map(res => res.json()); } 天数的对象。我意识到这个问题存在于此:django filter older than day(s)?

但是,我并没有尝试这样做,因为在我的案例中,天数居住在模型中:

X

这是我到目前为止的查询:

编辑:我更改了class Post(models.Model): title = models.CharField(max_length=200) description = models.CharField(max_length=500) createdAt = models.DateTimeField(default=datetime.now, blank=True) plan = models.ForeignKey(Plan) # This model has the number of days 的days.plan部分意味着我用来比较的天数在每个帖子的the_post.plan.days字段中。< / p>

plan

请注意查询的 Post.objects.filter(createdAt__lte=datetime.now() - timedelta(days=the_post.plan.days)) 部分。如何为此查询引用plan.days?有可能吗?

3 个答案:

答案 0 :(得分:2)

通过计划模型中的小调整,确实可以做你想做的事。

首先,您需要将计划days字段(可能是IntegerField)更改为DurationField

现在要注意的是,如果要在单独的查询中获取计划,我们必须使用ExpressionWrapper在Postgres中获得与您在Python中实现的结果完全相同的结果。

最后,您的查询应该是:

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

Post.objects.annotate(target_date=ExpressionWrapper(timezone.now() - F('plan__days'), output_field=DateTimeField())).filter(createdAt__lte=F('target_date'))

答案 1 :(得分:1)

假设Postgres数据库:

table_post = Post._meta.db_table
table_plan = Plan._meta.db_table

old_posts = Post.objects.select_related('plan')\
            .extra(where=["%s.created_at <= NOW() - INTERVAL '1 day' * %s.days"
                          % (table_post, table_plan)])

答案 2 :(得分:0)

对我来说,你必须首先抓住计划对象。

plan = Plan.objects.filter(...)

然后引用日期

 Post.objects.filter(createdAt__lte=datetime.now() - timedelta(days=plan.days))