2

私は次の-簡略化された-モデルを持っています:

class User(models.Model):
    following = models.ManyToManyField("self", through='Following', symmetrical=False)

class Following(models.Model):
    from_user = models.ForeignKey(User, related_name='from_user')
    to_user = models.ForeignKey(User, related_name='to_user')
    status = models.IntegerField()

ステータスは、保留中の場合は0、フォロー中の場合は1です。ユーザーをユーザーにします。フォローしているユーザーのすべてを取得したい

できます

user.following.all()

ユーザーがフォローしているすべてのユーザーを取得する(保留中の関係または実際にフォローしている)

また

Following.objects.filter(from_user=user, status=1)

ユーザーユーザーと本当の友情で以下のすべてのオブジェクトを取得するには

しかし、userおよびstatus = 1のすべてのUserオブジェクトを取得するにはどうすればよいですか?道が見つからないようです

ありがとうございました !

4

2 に答える 2

1

試す

user.following.filter(to_user__status=1)

user.followingまだクエリを実行しているため、リレーションw/をここUserにスパンする必要があります。__Follow

ここの2つのフィールド、from_userおよびto_userは、両方ともモデルForeignKeyを指しています。Userしたがって、User()インスタンスの場合u

  • u.following中間テーブルを介しUser()て関係を持つsを検索します。ここで重要なのは、それ自体への参照として、を指す最初のものを選択することです。したがって、のバージョンでは、に等しいおよびに等しいw/を持つアイテムをフィルタリングします。ルックアップは、逆方向の関係に従う典型的なものですuFollowu.followingForeignKeyFollowUseruFollowu.following.filter(to_user__status=1)Followfrom_useruto_userstatus1
  • u.from_userfrom_userに等しいものを中間テーブルで検索しますu
  • u.to_userto_userに等しいものを中間テーブルで検索しますu

また、とは両方とも:を参照しているForeignKeyことを覚えておいて、直接フィルタリングすることもできます。from_userto_userFollow

User.objects.filter(to_user__from_user=user, to_user__status=1) # user as from_user
User.objects.filter(from_user__to_user=user, from_user__status=1) # user as to_user
User.objects.filter(following=user) # those who are followed by `to_user` user
于 2012-11-08T16:37:49.323 に答える
0

のようだ

user.following.filter(to_user__status=1)

トリックを行います。誰かが私に理由とこれがどのように機能するかを説明できますか? user.followingUserを照会しているManyRelatedManagerです。何をuser.following.filter(from_user__status=1)しますか?それが何を返すかを推測することはできません...もう一度ありがとう!

于 2012-11-11T18:31:02.647 に答える