1

このタイプのデータを一覧表示するのに問題があります。シナリオは次のとおりです。

  1. user1addはuser2という友達です
  2. user2は、user1が彼の友達であることを確認します

何が起こるかは、user2とuser1が友達リストにお互いの名前を表示することです。現在、user2をuser1の友達リストに追加できますが、user1は自分のリストにuser2を表示できません。私の質問は、ユーザーが友情を確認した場合に、user1をuser2のリストに表示し、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,
        })
4

2 に答える 2

1

あなたの友情モデルが連想的であることは明らかではありません。私の友達は私がいるすべての友情のリストをリストしていfrom_userますか?それとも、私がまたはのどちらかであるすべての友情from_userですかto_user

前者の場合、すべての友達関係は2つの友情オブジェクトで表されます。1つはあなたが私の友達であることを示し、もう1つは私があなたの友達であることを示します。ユーザーがリクエストを行うたびに、2つの友情が追加されます。ステータスは、リクエストを行った人がであるか、であるかを示しfrom_userますto_user。そして、リクエストが確認または拒否されたら、これを反映するように両方の友情を更新します。

後者の場合、すべての友達関係は単一の友情オブジェクトによって表されます。この場合、オブジェクトの設計では、関係のどの友人がリクエストを行ったかを記録する必要があります。これにより、オブジェクトを調べるときに、どのユーザーがリクエストを確認済みの友情に変えることができるかがわかります。

于 2009-12-02T23:08:27.557 に答える
0

このページに基づく: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)
)
于 2009-12-03T07:32:48.560 に答える