대화방에 속한 모든 Message
을 얻기 위해 작업 쿼리 세트를 연결하는 데 문제가 있습니다. 두 명의 사용자 또는 Profiles
은 Pair
개체를 구성하며, 이는 두 사람 사이에 대화방을 나타내는 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
모델의 필드와 관련한 결정에 영향을 줄 것으로 생각합니다. 나는 생각하지 않는다 메시지가 누가 그 사람인지에 관계없이 방에 브로드 캐스트되기 때문에 명백한 사용자가 필요하다.
미리 감사드립니다.
는 한 쌍의 여러 방에있을 수 있습니까? 또는 쌍은 방과 일대일 관계입니다. –
@SajiXavier 한 쌍의 방은 여러 방에있을 수 없습니다. 두 개의 고유 한 프로파일의 쌍은 한 방에만있을 수 있습니다. 비록 그들 만의 방과 많은 다른 쌍이있을 수 있지만. – Homer
답변을 업데이트 했으므로 요구 사항에 부합하는지 확인하거나 문제를 알려주십시오. –