0

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 にメッセージを送信または受信した人) を選択する必要があります。

4

2 に答える 2

1

私の$.02だけですが、この種のロジックはSQLよりもPythonの方がうまく処理できると本当に思います。私の意見では、1 つの DB に固有のクエリ パラメータを使用すると、ORM の目的が無効になります。

私はこのようなことを試してみます:

messages = Message.objects.filter(Q(sender = request.user)|Q(recipient = request.user))
## Does this need to be 'Q'? ##

それで:

partners = set()
for m in messages:
    partners.add(m.sender)
    partners.add(m.recipient)

このセットを頻繁に見る場合は、キャッシュすることができます。

ただし、 のフィールドを作成し、メッセージが送信されるたびに追加する方よい場合があります。次に、複雑なクエリを作成する必要はなく、単純な.partnersUserUser.partners

とにかくメッセージを送信するにはオブジェクトを取得する必要があると想定しているUserため、余分なオーバーヘッドは発生しないはずです。

于 2013-08-27T13:29:52.563 に答える