2017-12-01 9 views
0

チャットルームに属するMessageをすべて取得するために問題のあるクエリセットを配線するのに問題があります。 2人のユーザー、またはProfilesPairオブジェクトを構成します。これは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モデルのフィールドに関する決定に影響を及ぼすと思われるチャネルを実装する予定です。私はとは思わないメッセージは誰がそれに関係なく部屋にブロードキャストされるので、明示的なユーザーが必要です。

ありがとうございます。

+0

ペアは複数の部屋にできますか?またはペアは部屋と1対1の関係にあります。 –

+0

@SajiXavier複数の部屋にペアを設定することはできません。 2つの固有のプロファイルのペアは、1つの部屋にしか配置できません。それぞれの部屋には多くの異なるペアがありますが。 – Homer

+0

私は答えを更新しましたので、あなたの要件に合っているかどうかを確認してください。 –

答えて

1

ペアモデルは必要ありません。部屋の2つのFK(所有者用と参加者用の2つ)で動作します。

class Room(models.Model): 
    """ 
    A room for people to chat in. 
    """ 
    # two directly to Profile 
    owner = models.ForeignKey(Profile, related_name='own_rooms') 
    # make it many to many for multiple participants 
    participant = models.ForeignKey(Profile, related_name='joined_rooms') 

    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 

ビューロジック

def chat_room(request, slug): 
    # find all own rooms 
    own_rooms = request.user.profile.own_rooms.all() 

    # Ideally chat apps displays all the rooms a user is member of and display messages for each rooms. In that case you pass rooms to the template context. 

    # same for rooms in which user is participant 
    # find rooms where logged in user is participant 
    joined_rooms = request.user.profile.joined_rooms.all() 

    # all the rooms where user is owner & participant 
    #combine both the rooms 
    rooms = list(own_rooms) + list(joined_rooms) 
+0

私は、このビュー内では、相手のチャットメンバーである "usera"に問い合わせることはできないと考えています。それ以外の場合は、メソッドが機能します。 申し訳ありません - もう一度組み込み、お返事します。今のところ、私はそれが動作しないと思っているのは、ペアがプロファイルの任意の組み合わせで作ることができるからです。そして、ビュー内から一致するペアを手動で照会することはできません - 私はrequest.userしか取得できません。 – Homer

+0

テンプレートルームに部屋を渡し、各部屋のメッセージを表示する必要があります。私はあなたの質問の下の声明に基づいて両方のプロフィールを持っていると仮定しました。 「私の見解では、部屋が属する2つのプロファイルを考慮して、どの部屋に属するすべてのメッセージを取得するのですか? –

+0

混乱して申し訳ありません - その声明では、私が説明する必要がある2つのプロファイルがあるので、私は問題を抱えていたことを意味しました。 これは、ユーザーの部屋のすべてをテンプレートに渡し、テンプレートを使用してメッセージにアクセスすることを意味しますか? – Homer

関連する問題