2017-12-01 3 views
0

대화방에 속한 모든 Message을 얻기 위해 작업 쿼리 세트를 연결하는 데 문제가 있습니다. 두 명의 사용자 또는 ProfilesPair 개체를 구성하며, 이는 두 사람 사이에 대화방을 나타내는 Room과 관련됩니다. Message는 채팅방에 속합니다. 여기 (메시지, 룸, 쌍, 프로필 관련 모델입니다 동일한 모델에 두 개의 FK가있는 모델을 가지고있을 때 FK 역방향 관계 확인

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, 
    }) 

거꾸로가는 :

내가 모든 이전에 전송/저장 메시지로 미리 채울 시도 chat_room의보기이다) :

내보기에서
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) 

, 어떻게 고려 방에 속하는 두 개의 프로필을 복용 방에 속하는 모든 메시지를 얻을 것인가?

편집 : 가치가있는 것 : 채널을 구현할 계획입니다. Room 모델의 필드와 관련한 결정에 영향을 줄 것으로 생각합니다. 나는 생각하지 않는다 메시지가 누가 그 사람인지에 관계없이 방에 브로드 캐스트되기 때문에 명백한 사용자가 필요하다.

미리 감사드립니다.

+0

는 한 쌍의 여러 방에있을 수 있습니까? 또는 쌍은 방과 일대일 관계입니다. –

+0

@SajiXavier 한 쌍의 방은 여러 방에있을 수 없습니다. 두 개의 고유 한 프로파일의 쌍은 한 방에만있을 수 있습니다. 비록 그들 만의 방과 많은 다른 쌍이있을 수 있지만. – Homer

+0

답변을 업데이트 했으므로 요구 사항에 부합하는지 확인하거나 문제를 알려주십시오. –

답변

1

페어 모델은 필요하지 않습니다.이 모델은 두 개의 FK (소유자 및 참가자 용으로 하나씩)에서 작동합니다.

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

이므로 템플릿 컨텍스트에 방을 전달하고 각 방의 메시지를 표시해야합니다. 나는 당신이 당신의 질문에 아래 진술에 기초한 두 가지 프로파일을 가지고 있다고 가정했다. "내 견해로 볼 때 방에 속한 모든 메시지를 어떻게 얻을 수 있을까요? 그 방이 속한 두 개의 프로필을 고려해야합니다." –

+0

혼란에 대해 유감스럽게 생각합니다. 그 진술과 관련하여, 제가 설명해야 할 두 가지 프로필이 있다는 것을 생각하면, 저는 문제가 있다는 것을 의미했습니다. 그러면 모든 사용자의 회의실을 템플릿에 전달하고 템플릿을 통해 메시지에 액세스 할 수 있습니까? – Homer

관련 문제