チャットルームに属するMessage
をすべて取得するために問題のあるクエリセットを配線するのに問題があります。 2人のユーザー、またはProfiles
はPair
オブジェクトを構成します。これはRoom
に関連するもので、2人のユーザーの間にチャットルームを表します。 Message
はチャットルーム内に属します。同じモデルに2つのFKを持つモデルを持っているときにFKの後方関係を解決する
これは私がすべての以前に送られた/メッセージを保存して事前に移入しようとchat_room
ための図である。ここでは、後方に行く
def chat_room(request, slug):
# a failing queryset
messages = reversed(request.user.profile.pairing_requester.get(requester=request.user.profile).room.get(occupants=).messages.order_by('-timestamp')[:50])
return render(request, "chat/room.html", {
'messages': messages,
})
は、関連するモデル(メッセージ、ルーム、ペア、プロフィールです):
class Message(models.Model):
room = models.ForeignKey(Room, related_name='messages')
handle = models.TextField()
message = models.TextField()
timestamp = models.DateTimeField(default=timezone.now, db_index=True)
def __unicode__(self):
return '[{timestamp}] {handle}: {message}'.format(**self.as_dict())
@property
def formatted_timestamp(self):
return self.timestamp.strftime('%b %-d %-I:%M %p')
class Room(models.Model):
"""
A room for people to chat in.
"""
# Unsure whether to have a single FK to Pair, or two directly to Profile
occupants = models.ForeignKey(Pair, related_name='room')
title = models.CharField(max_length=255)
slug = models.SlugField()
timestamp = models.DateTimeField(default=timezone.now, db_index=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class Pair(models.Model):
requester = models.ForeignKey(Profile, related_name='pairing_requester')
accepter = models.ForeignKey(Profile, related_name='pairing_accepter')
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True, blank=True)
私の見解から、どのように私は考慮に部屋がに属している2つのプロファイルを取って、部屋に所属するすべてのメッセージを得るでしょうか?
編集:価値のあるもの:Room
モデルのフィールドに関する決定に影響を及ぼすと思われるチャネルを実装する予定です。私はとは思わないメッセージは誰がそれに関係なく部屋にブロードキャストされるので、明示的なユーザーが必要です。
ありがとうございます。
ペアは複数の部屋にできますか?またはペアは部屋と1対1の関係にあります。 –
@SajiXavier複数の部屋にペアを設定することはできません。 2つの固有のプロファイルのペアは、1つの部屋にしか配置できません。それぞれの部屋には多くの異なるペアがありますが。 – Homer
私は答えを更新しましたので、あなたの要件に合っているかどうかを確認してください。 –