2011-02-08 33 views
6
class Log: 
project = ForeignKey(Project) 
msg = CharField(...) 
date = DateField(...) 

各Logエントリに固有のプロジェクト外部キーが必要な最新の4つのLogエントリを選択します。Django:別個の外部キー

Log.objects.all().distinct('project')[:4] 
Log.objects.values('project').distinct()[:4] 
Log.objects.values_list('project').distinct('project')[:4] 

しかし、これは何も返さないかのどちらか:私はのようなものを試した私がしたGoogle検索にソリューションをしようとしますが、それらのどれも働かないとDjangoのドキュメントは、ルックアップのために、非常に良いではない..です

同じプロジェクトのログエントリ..

助けていただければ幸いです!

答えて

9

クエリーは、DjangoのORMまたは基礎となるSQLのいずれかと同じように機能しません。一意のIDを取得する場合は、IDのみを照会できます。実際のログエントリを取得するには、2つのクエリを実行する必要があります。何かのように:

+0

、答えをunfortuatly ID_LIST = Log.objects.order_byありがとうございます。。( ' - 日')values_list( 'PROJECT_ID')を別々の() ..動作しません。それは別のものを整理しません。チェーン内のorder_by()を削除すると動作しますが、日付でソートされていません... – mrmclovin

+0

これはまだ動作しません。 – mrmclovin

+0

pkを試したり、pythonのreduce()関数を使用してください –

3

実際には、SQLでproject_idsを取得することができます。あなたは、最新のログエントリを持つ4つのプロジェクトのためのユニークなプロジェクトのidをしたいと仮定すると、SQLは次のようになります。

SELECT project_id, max(log.date) as max_date 
FROM logs 
GROUP BY project_id 
ORDER BY max_date DESC LIMIT 4; 

さて、あなたが実際にログ情報のすべてが欲しいです。 PostgreSQLの8.4以降では、あなたは、ウィンドウ関数を使用することができますが、それは他のバージョン/データベースでは動作しませんので、私はそれを、より複雑な方法をやる:

SELECT logs.* 
FROM logs JOIN (
    SELECT project_id, max(log.date) as max_date 
    FROM logs 
    GROUP BY project_id 
    ORDER BY max_date DESC LIMIT 4) as latest 
ON logs.project_id = latest.project_id 
    AND logs.date = latest.max_date; 

、あなたがへアクセス権を持っている場合ウィンドウ関数、それは少しの滑らかな印象(私はとにかくだと思う)だと、確かに高速に実行するには、次のOKは、多分それは理解しやすくはないが、それは私の言葉を取る、それが大規模なデータベースに速い世界を

SELECT * FROM (
    SELECT logs.field1, logs.field2, logs.field3, logs.date 
     rank() over (partition by project_id 
        order by "date" DESC) as dateorder 
    FROM logs) as logsort 
WHERE dateorder = 1 
ORDER BY logs.date DESC LIMIT 1; 

を実行します。

オブジェクトの構文にどのように変換されるのか、それがどういう場合でも、私は完全にはわかりません。また、他のプロジェクトデータを取得する場合は、プロジェクトテーブルに参加する必要があります。

+0

答えをありがとう!それを試してみましょう! – mrmclovin

関連する問題