2011-08-11 46 views
7

カラムに最大/最小値を持つレコードに基づいてDjangoクエリをフィルタリングする簡単な方法はありますか?私は本質的にthesequestionsを求めていますが、DjangoのORMの特定のコンテキストでです。最大カラム値を持つレコードによるDjangoクエリのフィルタリング

私は全員の電話番号の履歴値を保存するように設計されたモデルがあります。レコードを持つ

class Person(models.Model): 
    name = models.CharField(max_length=100) 
    phone = models.CharField(max_length=100) 
    created = models.DateTimeField(auto_now_add=True) 

Person(name='Jim',phone='123-456-9870', created=datetime(2005,1,2,4,2)) 
Person(name='Jim',phone='329-802-9870', created=datetime(2006,9,2,7,8)) 
Person(name='Sue',phone='324-345-3450', created=datetime(2008,7,4,6,1)) 

は今、私は皆の最新の電話番号を探していましたと言います。 SQLで

、私は通常の最大値を計算するためにサブクエリを使用する必要があるだろう:

SELECT p1.name, p1.phone, p1.created 
FROM person_person p1, (
    SELECT name, MAX(created) AS max_created 
    FROM person_person 
    GROUP BY name 
) AS p2 
WHERE p1.name = p2.name AND p1.created = p2.max_created 

はこれを簡素化することができジャンゴのいずれかのメカニズムがありますか?

私はバックエンドでPostgreSQLを使用していますので、PostgreSQL固有の機能に依存する考えや解決策があれば助かります。

+0

これは、djangoでは、生のクエリsqlを使用しない限り、探しているものを実行できないようです。 [this](https://docs.djangoproject.com/ja/dev/ref/models/querysets/#distinct)をチェックしてください。現時点では、作成されたorder_by( 'created')をクエリのselectに追加するので、distinctは何も行いません。 – Hassek

答えて

4

ここでは生のSQLを使用したいと思うかもしれませんが、raw()マネージャメソッドはこれを容易にして、クエリからモデルインスタンスを返すことができます。唯一のやり方は、生のクエリに主キーを含める必要があることです。これはおそらく、(あなたがid以外に設定主キーを持っていない限り)あなたのために働く必要があります。

latest_phone_numbers = Person.objects.raw(''' 
SELECT p1.id, p1.name, p1.phone, p1.created 
FROM person_person p1, (
    SELECT name, MAX(created) AS max_created 
    FROM person_person 
    GROUP BY name 
) AS p2 
WHERE p1.name = p2.name AND p1.created = p2.max_created 
''') 
1

あなたのバックエンドがPostgreSQLのRoman Pekarある場合this質問に対する良い答えを与えました。

関連する問題