문제

이 유형의 데이터를 나열하는 데 어려움이 있습니다. 시나리오는 다음과 같습니다.

  1. user1 add는 user2라는 친구입니다
  2. user2는 user1이 그의 친구임을 확인합니다

무슨 일이 일어나야하는지 user2 및 user1은 친구 목록에서 서로 이름을 참조하십시오. 지금 일어나고있는 일은 user2에 user2를 추가 할 수 있지만 user1은 자신의 목록에서 user2를 볼 수 없습니다. 내 질문은 사용자가 우정을 확인한 경우 user1의 목록에 사용자 1과 user2가 user1의 친구 목록에 표시되도록하는 방법입니다. 나는 모델의 확인 상태를 활용할 생각을하고 있었고, user1과 user2의 ID가 확인 된 관계에 있기 때문에 여기에는 무결성 문제가 나타나지 않습니다. 팁이 있습니까?

우정 모델 :

class Friendship(models.Model):
        NOT_CONFIRMED = 1
        PENDING= 2
        CONFIRMED = 3

        STATUS_CHOICES = (
                (NOT_CONFIRMED, 'Not Confirmed'),
                (PENDING, 'Pending'),
                (CONFIRMED, 'Confirmed'),
        )
        from_friend = models.ForeignKey(User, related_name='friend_set')
        to_friend = models.ForeignKey(User, related_name='to_friend_set')
        confirmed = models.IntegerField(choices=STATUS_CHOICES,
default=NOT_CONFIRMED)

        class Meta:
                unique_together = (('to_friend', 'from_friend'),)

        def __unicode__(self):
                return '%s, %s' % (self.from_friend.username,
self.to_friend.username)

우정을 렌더링하려는 견해 (당신이 볼 수 있듯이 필터링을 가지고 놀았습니다) :

@login_required
def friends_list(request, username):
        user = get_object_or_404(User, username=username)
        #friends = [friendship for friendship in user.friend_set.filter(Q
(confirmed=2) | Q(confirmed=3))]
        friends = Friendship.objects.filter(
                Q(to_friend=user) | Q(confirmed=3)
        )

        # get friends latest 10 shows
        friend_shows = Show.objects.filter(user__in=friends).order_by('-id')
        return render_to_response('habit/friends_list.html', {
                'user': request.user,
                'friends': friends,
                'shows': friend_shows[:10],
                'username': username,
        })
도움이 되었습니까?

해결책

우정 모델이 연관성이라는 것은 분명하지 않습니다. 내 친구가 내가 from_user? 아니면 모든 우정입니까? from_user 아니면 그 to_user?

그것이 전자라면, 모든 친구 관계는 두 개의 우정 대상으로 표현됩니다. 하나는 당신이 내 친구라는 것을 나타내고, 하나는 내가 당신의 친구임을 나타냅니다. 사용자가 요청을 할 때마다 두 가지 우정을 추가 할 것입니다. 상태는 요청을하는 사람이 from_user 아니면 그 to_user. 그리고 요청이 확인되거나 거부되면,이를 반영하기 위해 두 우정을 업데이트 할 것입니다.

그것이 후자라면, 모든 친구 관계는 단일 우정 대상으로 표현됩니다. 이 경우, 객체 디자인은 관계에서 어떤 친구가 요청을했는지 녹음해야하므로 객체를 검사 할 때 어떤 사용자가 요청을 확인 된 우정으로 바꿀 수 있는지 알 수 있습니다.

다른 팁

이 페이지를 기반으로 : http://docs.djangoproject.com/en/dev/topics/db/queries/

다음 코드 :

friends = Friendship.objects.filter(
        Q(to_friend=user) | Q(confirmed=3)
)

동일합니다 : to_friend = user OR confirmed = 3. 설명을 바탕으로 원하는 것이 아닐 것입니다.

이것은 당신이 원하는 것에 더 가깝게 보입니다.

friends = Friendship.objects.filter(
        Q(to_friend=user) | Q(from_friend=user)
      , Q(confirmed=3)
)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top