2009-09-03 12 views
2

Djangoを初めて使用していて、単純なクエリに関するいくつかの問題があります。Django DB APIはやや複雑なSQLクエリと同等です

私は電子メールアプリケーションを書いているとしましょう。これは、メール モデルである:書かれて答えるされている電子メールメッセージ のセットを識別し、各メールがconversation_idた


class Mail(models.Model): 
    to = models.ForeignKey(User, related_name = "to") 
    sender = models.ForeignKey(User, related_name = "sender") 
    subject = models.CharField() 
    conversation_id = models.IntegerField() 
    read = models.BooleanField() 
    message = models.TextField() 
    sent_time = models.DateTimeField(auto_now_add = True) 

。今、受信ボックスにメールを掲載するために、私は は、Gmailが会話ごとに最後のメールのみを表示するようにしたいと考えています。

私は仕事をしているSQL同等物を持っていますが、これに対してネイティブなDjangoクエリーをどのように構築するのですか?


select 
     * 
from 
     main_intermail 
where 
     id in 
     (select 
       max(id) 
     from 
       main_intermail 
     group by conversation_id); 

ありがとうございます!

答えて

1

これは機能しますか? Django 1.1が必要です。

+0

Davidありがとう!それは完璧に動作します! – edkirin

0

したがって、conversation_idを指定すると、最高のidの関連レコードを取得する必要があります。これを行うには、idが最初に来るようにするために、結果を降順で並べ替えるためにorder_byを使用し、配列の構文を使用して、最初の項目を取得します。これは、最も高い項目がidです。

# Get latest message for conversation #42 
Mail.objects.filter(conversation_id__exact=42).order_by('-id')[0] 

ただし、これはSQLクエリとは異なります。あなたの質問は、の最新のメッセージをすべての会話から提供するようです。特定の会話からの最新のメッセージを提供します。そのユーザーの会話のリストを取得するために常に1つのクエリを実行し、複数のクエリをフォローアップして各会話から最新のメッセージを取得することができます。

+0

回答ありがとうございますが、これは私が必要なものではありません。私は後で改ページするために単一のDjangoクエリが必要なので、各会話の値を手動でフェッチする必要はありません。 – edkirin

関連する問題