我需要过滤超过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
?有可能吗?
答案 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))