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

时间:2018-12-16 14:29:17

标签: django django-models django-templates django-views django-queryset

我目前正在使用Django Framework构建网站。我想在我网站的主页上显示用户关注的人发布的所有帖子。以下是个人资料,故事和关注的课程:

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)

如您所见,“跟随”使用两个外键来表示关注者和关注者。有没有办法查询用户关注的人的所有故事?

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

following_feed = Story.object.filter(???).order_by('-creation_date')

2 个答案:

答案 0 :(得分:2)

一个人可以使用 double 下划线(__)来查找“直通”关系(例如ForeignKey等)。

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

Story.objects.filter(
    author__following__follower=my_profile
)

因此,通过使用author,我们获得了作者Profile的引用,然后使用following,我们研究了Follow模型,最后使用了{{1 }},我们再次获得对follower的引用:关注者的个人资料。

Profile当然需要用my_profile对象({{1}的Profile中的followerauthor } s)。

这将生成如下查询:

Story

其中SELECT s.* FROM story AS s JOIN follow AS f ON f.following_id = s.author_id WHERE f.follower_id = 123 123的{​​{1}}。

如果一个人多次关注另一个人(在这种情况下可能会发生,因为您没有强制id模型中的my_profile元组是唯一的),则相应的follower, following s将产生 multiple 次。

因此,最好在Follow模型中添加Story约束:

unique_together

也许值得把Follow模型看作是ManyToManyField [Django-doc]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'), )模型。

答案 1 :(得分:2)

请注意,我还没有测试过要发布的代码,因此请告诉我是否缺少某些内容。
首先,您需要获取用户遵循的所有Profiles。然后,您必须获得他们拥有的Stories

followed_people = Follow.objects.filter(follower=current_user).values('following')
stories = Story.objects.filter(author__in=followed_people)