2017-07-18 15 views
1

私はDjangoのポストグレをArrayFieldに利用しています。Django - ArrayFieldの最新の日付を問い合わせる

from django.db import models 
from django.contrib.postgres.fields import ArrayField 

class Event(models.Model): 
    name = models.CharField(max_length=200) 
    dates = ArrayField(models.DateField()) 

そして、私は最新の日付とEventを見つけたい:

は、私はこのようなモデルを持っていると言います。それを行うことができるクエリーセットを構築する方法はありますか?

+1

'EventDates'にサロゲートテーブルを追加する方がよいでしょうか? – joanolo

+0

おそらく、現在のところ、DBはその方法であり、その中に大量のデータがあります。私は、主要なスキーマの変更とデータの移行を行う前にArrayFieldで行うことができるかどうかを調べることを望んでいます。また、この特定のテーブルは非常に難解ですが、ほとんどの日付関連のクエリ(この特定の最大日付クエリ以外は必要ありません。頻繁に必要とされることはありません)だから私は結合を避けたい。 – Troy

答えて

1

私はDjangoの詳細を知ることができません(私はあまりそれに堪能ではありません)。しかし、いくつかのポインタ:、ジャンゴに

SELECT 
    name, (SELECT max(d) FROM unnest(dates) d) AS latest_date 
FROM 
    Event ; 
  • backconvertこのへのDjango Postgresql ArrayField aggregationをチェックして、あなたのspecifcケースに適応させる:

    1. 直接SQL言語を使用して、あなたが使用します。

      私は次のコードの線に沿って何かがトリックを行うべきだと思う:

      Event.objects.annotate(arr_els=Func(F('dates'), function='unnest')) \ 
           .values_list('arr_els', flat=True).aggregate(Max('arr_els')) 
      

    dbfiddle hereでSQLの例を参照してください。

    1)私はDjangoの部分をテストするための適切な環境を持っていないので、これはテストされていません。

  • +0

    実際にコードを試しましたか?それを修正する必要がありましたか? – joanolo

    +1

    はい、私はしました。上記は実際には、最新の日付を持つ 'Event'ではなく、' Event'sの中で最新の日付を見つけます。しかし、それは実際に私が最終的に得ようとしていたものです。そして、もし私が 'Event'を望むなら、それは一度私が日付を持っていれば十分簡単です。 – Troy

    関連する問題