3 つのフィールドを持つチャット メッセージのモデルがあります。
送信者、受信者 ( User モデルの ForeignKey )、および TextField としてのメッセージ。
いずれかの送信者または受信者フィールド (request.user を除く) を持つすべての一意の会話を選択しようとしています。そして、私はそれを実装する方法に少し混乱しています。
私は2つの問題を抱えています:
Message.objects.filter(Q(sender = request.user)|Q(recipient = request.user)).values('sender').distinct()
一意のレコードのリストを返しません ( order_by を使用しても)。私はまったく同じ送信者をたくさん持っています: {'sender': 4L}, {'sender': 4L}
(受信者も同じです)。
そして2番目の問題は次のとおりです。
2 つのクエリセット (送信者と受信者用) を連結する必要がありますか? または、現在の request.user の会話の全リストを取得する別の方法がありますか?
更新。わかりました、ここにテーブルの内容があります:
mysql> select id, sender_id, recipient_id, body from messages_message ;
+----+-----------+--------------+-----------+
| id | sender_id | recipient_id | body |
+----+-----------+--------------+-----------+
| 1 | 4 | 1 | Message 1 |
| 2 | 4 | 1 | Message 2 |
+----+-----------+--------------+-----------+
そしてここにそれはの結果です
Message.objects.filter(Q(sender = request.user)|Q(recipient = request.user)).values('sender').distinct()
[{'sender': 4L}, {'sender': 4L}]
しかし、私はちょうど[{'sender': 4L}]
.
それで、何が問題なのですか?
upd2. 私のモデル:
class Message(models.Model):
body = models.TextField(_("Body"))
sender = models.ForeignKey(User, related_name='sent_messages', verbose_name=_("Sender"))
recipient = models.ForeignKey(User, related_name='received_messages', null=True, blank=True, verbose_name=_("Recipient"))
sent_at = models.DateTimeField(_("sent at"), null=True, blank=True)
現在のユーザーのすべての会話パートナー (request.user にメッセージを送信または受信した人) を選択する必要があります。