私は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')
...は変更されません。結果
あなたは 'convs_read = convs_read.order_by( ' - messages__date_last_modif')'を試したことがありますか? –
はい、私はその質問を –