2016-11-15 9 views
3

X日数より古いオブジェクトをフィルタリングする必要があります。私はこの質問がここに存在して実現:django filter older than day(s)?Django - 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 

これは私が持っているクエリですはるか:

はEDIT:私は比較することで使用している日数は、各ポストの​​フィールドであることを意味the_post.plan.daysためdays.plan一部を変更しました。

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

クエリのplan.daysに注意してください。このクエリではthe_post.plan.daysをどのように参照できますか?出来ますか?

答えて

2

を参照し、あなたがやりたいことが実際に可能です。

まず、プランdaysフィールド(IntegerField)をDurationFieldに変更する必要があります。

ここでは、ExpressionWrapperを使用して、別のクエリでプランを取得する場合にPythonで達成した結果と同じ結果をPostgres内で達成する必要があるということです。

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')) 
+0

Hey @lucasnadaluttiこれは正しい答えのようですが、私はこのエラーを取り返しています: 'ValueError:素朴なdatetime(tzinfoはすでに設定されています)'が分からない理由 – danielrvt

+0

'datetime.now()'を 'timezone .now() '、from django.utils import timezone'でインポートされています – lucasnadalutti

0

私にとっては、まずプランオブジェクトを取得する必要があります。

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

、その後の日、あなたの計画モデルの小さな微調整して

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

どのようにこの質問が含まれているものとは何が違うのです

最後には、クエリは次のようにすべきですか? – Brian

+0

ポストモデルのプランは別のテーブルを参照しているため、日数を知ることができませんでした。この例の は、最初に必要なプランを取得し、plan変数には日の変数(たとえば3)を設定します。次に、必要なプランの投稿を見つけることができます。 – user2693928

+0

これはすでに問題がしていることです。 'plan.days'はそれ以外の場合は' Post.plan.days'(これはAttributeErrorです)または類似のものを読み込みます。 – Brian

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)]) 
関連する問題