根据其他模型的字段过滤一个模型

时间:2020-10-09 09:58:21

标签: django django-models django-queryset

我有以下型号:

class User(AbstractUser):
    pass

class Post(models.Model):
    post_user = models.ForeignKey(User, on_delete=models.CASCADE)
    post_content = models.TextField()
    post_date = models.DateTimeField(default=timezone.now)

class Follow(models.Model):
    follow_user = models.ForeignKey(User, on_delete=models.CASCADE)
    follow_target = models.ForeignKey(User, on_delete=models.CASCADE, related_name='follow_target')

我正在尝试创建一个由我关注的用户(我是当前登录的用户)创建的所有帖子的查询集。我的查询集当前看起来像这样,但我一直在获取NameError:找不到字段:

postresult = Post.objects.all().filter(post_user=follow__follow_target, follow__follow_user=request.user)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您的过滤条件为:

postresult = Post.objects.filter(
    post_user__follow_target__follow_user=request.user
)

post_user将跟随ForeignKeyPostUser。然后,我们使用related_name='follow_target'来跟踪与Follow对象的关系,然后我们使用follow_user来检索以下用户。


注意:与直接使用settings.AUTH_USER_MODEL [Django-doc]相比,通常最好使用User model [Django-doc]来引用用户模型。有关更多信息,请参见referencing the User model section of the documentation


注意related_name=… parameter [Django-doc] reverse 中关系的名称,因此从User模型到Follow 在这种情况下的模型。因此,(通常)将其命名为 与前向关系相同。因此,您可能需要考虑将 follow_target 关系重命名为followers

如果重命名相关名称,则查询为:

postresult = Post.objects.filter(
    post_user__followers__follow_user=request.user
)