Django 查询:如何查找您关注的人的所有帖子

Fre*_*ter 4 django django-templates django-models django-queryset django-views

我目前正在使用 Django 框架构建一个网站。我希望在我的网站的主页上显示用户关注的人发布的所有帖子。以下是个人资料、故事和关注的类:

class Profile(AbstractBaseUser, PermissionsMixin):
   email = models.EmailField(unique=True)
   first_name = models.CharField(max_length=30, null=True)
   last_name = models.CharField(max_length=30, null=True)

class Follow(models.Model):
   following = models.ForeignKey('Profile', on_delete=models.CASCADE, related_name="following")
   follower = models.ForeignKey('Profile', on_delete=models.CASCADE, related_name="follower")
   follow_time = models.DateTimeField(auto_now=True)

class Story(models.Model):
   author = models.ForeignKey('accounts.Profile', on_delete=models.CASCADE, related_name="author")
   title = models.CharField(max_length=50)
   content = models.TextField(max_length=10000)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Follow 使用两个外键来表示关注者和关注者。有没有办法查询用户关注的人的所有故事?

我真的不知道要过滤什么。或者这可能是聚合的工作?如果有人能帮助我,那就太好了!

following_feed = Story.object.filter(???).order_by('-creation_date')
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 7

可以使用下划线 ( __) 来“查看”关系(如ForeignKeys 等)。

所以在这里我们可以这样过滤:

Story.objects.filter(
    author__following__follower=my_profile
)
Run Code Online (Sandbox Code Playgroud)

因此,通过使用我们获得对作者的author引用,然后我们查看模型,最后我们再次获得对追随者的个人资料的引用。ProfilefollowingFollowfollowerProfile

my_profile当然需要用一个对象替换(您希望获得的 s中的 s中Profile的一个人的个人资料)。followerauthorStory

这将生成如下查询:

SELECT s.*
FROM story AS s
JOIN follow AS f ON f.following_id = s.author_id
WHERE f.follower_id = 123
Run Code Online (Sandbox Code Playgroud)

123是在哪里。idmy_profile

如果一个人多次关注另一个人(这里可能会发生这种情况,因为您没有强制模型follower, following中的元组是唯一的Follow),那么相应的s 将多次Story生成。

因此,最好unique_togetherFollow模型中添加约束:

class Follow(models.Model):
    following = models.ForeignKey(
        'Profile',
        on_delete=models.CASCADE,
        related_name="following"
    )
    follower = models.ForeignKey(
        'Profile',
        on_delete=models.CASCADE,
        related_name="follower"
    )
    follow_time = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = (('following', 'follower'), )
Run Code Online (Sandbox Code Playgroud)

Follow将模型视为[Django-doc]through的模型也可能是值得的。ManyToManyField