2016-05-18 13 views
0

私はConversationモデルとモデルを持っています。 Messageの日付フィールドはdate_creationです。Django:外部キーに基づいて "順序付け"フィルタを作る方法

Conversationは、このようなmessagesを通じて多対多Messageがあります

class Message(models.Model): 
    date_last_modif = models.DateTimeField(auto_now=True) 
    src = models.ForeignKey('User', related_name='message_src') 
    dst = models.ForeignKey('User', related_name='message_dst') 
    is_read = models.BooleanField(default=False) 
    message = models.TextField(null=True, blank=True) 

class Conversation(models.Model): 
    messages = models.ManyToManyField(Message, related_name='conversations') 

私が何をしたいのですがどのような最初の最新のメッセージが注文何読み取りメッセージを、持っていないすべての会話を取得することです。より多く存在する場合、そうでない場合、私は会話を取得する明確な必要

p = current_user # code omitted for sake of clarity 
convs_not_read = Conversation.objects.filter(
    Q(messages__dst=p, messages__is_read=False)).distinct() 

たらをIDS:

だから、ここでまだ読んでいないメッセージを持っているすべての会話を取得する私の最初のフィルタです1つの未読メッセージは、この会話に未読メッセージがあるのと同じ回数だけ同じIDを取得します。

これ以降、すべての会話に未読のメッセージがないことを確認し、の最新のメッセージで注文します。

convs_read = Conversation.objects 
     .filter(messages__dst=p) 
     .exclude(pk__in=convs_not_read.values_list('id', flat=True)) 
     .distinct() 

これは動作しますが、彼らは最新のメッセージによってフィルタリングされていません。

は私が始まったしました。私はここで立ち往生している。どうしますか?

私がしようとした場合:このクエリのどこにでも.order_by('-messages__date_last_modif')を追加するために、それはここでは、効果がありません:

 .filter(messages__dst=p) 
     .order_by('-messages__date_last_modif') 
     .exclude(pk__in=convs_not_read.values_list('id', flat=True)) 
     .distinct() 

...またはここに:

 .filter(messages__dst=p) 
     .exclude(pk__in=convs_not_read.values_list('id', flat=True)) 
     .distinct() 
     .order_by('-messages__date_last_modif') 

...は変更されません。結果

+0

あなたは 'convs_read = convs_read.order_by( ' - messages__date_last_modif')'を試したことがありますか? –

+0

はい、私はその質問を –

答えて

-1

"conversations"として使用しているので、:それはまだ追加されていない場合、メッセージの日付によってI最初の並べ替えをし、各メッセージのためには、私はその会話のpkを追加します。私はこれが最も最適化されたソリューションではないと確信していますので、この作業ソリューションに基づいた提案があれば、私はあなたの人です!

l = [] 
for m in Message.objects.filter(dst=p).order_by('-date_last_modif'): 
    for c in m.conversations.all(): 
     if c not in l: 
      l.append(c.pk) 
conversations_read = [c for c in Conversation.objects.filter(pk__in=l)] 
+0

に更新します。申し訳ありません、私は時間があることを望みますが、今は時間がありません。 –

0

は、使用してみてください:

my_query.order_by('-conversations__date_last_modif') 

私は手で、この「ソート」をやっているrelated_name

関連する問題