【问题标题】:Django Query: How to find all posts from people you followDjango Query:如何查找您关注的人的所有帖子
【发布时间】:2019-05-17 02:30:48
【问题描述】:

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

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)

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    Story.objects.filter(
        author__following__follower=my_profile
    )

    因此,通过使用author,我们获得了对作者Profile 的引用,然后使用following,我们查看Follow 模型,最后使用follower,我们再次获得对@987654330 的引用@(s):关注者的个人资料。

    my_profile 当然需要替换为Profile 对象(您希望获得的authors 的follower 的个人资料)。

    这将生成如下查询:

    SELECT s.*
    FROM story AS s
    JOIN follow AS f ON f.following_id = s.author_id
    WHERE f.follower_id = 123
    

    其中123my_profileid

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

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

    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'), )

    Follow 模型视为ManyToManyField [Django-doc]through 模型可能也值得一看。

    【讨论】:

    • 我将如何找到当前经过身份验证的用户的 Profile 对象?
    • @FrederikVanclooster:使用request.user 可以获得用户模型(默认情况下这是User 模型,尽管您可以更改它)。如果您没有将其设置为Profile,那么您将需要关注您在UserProfile 之间设置的ForeignKey,或者根据匹配数据(如电子邮件地址)执行查找等,尽管后者是数据重复,因此是一种严重的反模式。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2013-01-03
      相关资源
      最近更新 更多