【问题标题】:How to get user queryset who commented to certain post in Python, Django?如何获取对 Python、Django 中的某些帖子发表评论的用户查询集?
【发布时间】:2018-01-29 10:54:47
【问题描述】:

我想获得一个在某些帖子中发表评论的用户查询集。 假设有一个帖子(id=3),并且有 8 个人对其发表了评论。 我想通知 8 个人,所以我想获得 8 个人的查询集(用户对象)。 我该怎么做?

我有模型用户、帖子和评论。

例如,

User.objects.get(comment__Post.objects.filter(id='3'))

喜欢这种方式。 (当然,鞋面不行)

帮帮我!


用户模型是 Django 用户模型。

class Post(models.Model):
    post_id = models.CharField('username', max_length=150)
    ...

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    com_id = models.CharField('username', max_length=150)
    ....

【问题讨论】:

  • 您能说明一下您是如何定义模型的吗?
  • 你Post模型有用户信息吗?
  • 用户模型是 Django 用户模型。
  • @HSPark 我的意思是你如何定义 Post 和 Comment 模型
  • @alessioferri20 我添加了它们!

标签: python django django-queryset


【解决方案1】:

理想情况下,您的模型应如下所示

class Post(models.Model):
    posted_by = models.ForeignKey(User, on_delete=models.CASCADE)
    ...

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    comment = models.CharField(max_length=100)
    commented_by = models.ForeignKey(User, on_delete=models.CASCADE)

您的要求可以通过以下查询来实现

post = Post.objects.get(id=3)
user_ids = list(Comment.objects.filter(post=post).values_list('user__id', flat=True))

这将返回用户 ID 列表

如果你需要查询集,

users = User.objects.filter(id__in=user_ids)

【讨论】:

  • 您不想将user_ids 转换为list,因为这将评估查询集,从而导致对数据库的不必要查询。只需删除list( ... ),django ORM 就会足够聪明,可以一次性完成整个查询。我认为,在这种情况下,您甚至可以删除 flat=True
  • 但这将是 Comments 模型对象。不是用户模型对象
  • 完全没有,因为你在做User.objects.filter(id__in=Comment.objects.filter(post=post).values_list('user__id'))。这转化为一个带有(我相信)LEFT JOIN 的 SQL 查询。
  • 我试过了,output = Comment.objects.filter(post=post).values_list('user__id'),我得到了一个查询集作为输出。根据您的说法,它应该是用户对象。然后我尝试了output.filter(username='xxx')。这会引发错误,即无法将关键字“用户名”解析到字段中。选项有:post、comment、commented_by
  • 不,Comment.objects.filter()... 肯定是QuerySet<Comment>。我的意思是,如果您执行.values_list('user__id'),则可以使用that 查询集作为User.objects.filter() 的参数,并保存数据库查询。请仔细阅读我的comment,看看我在顶级过滤User
【解决方案2】:

在我看来,您应该将OneToOneField 添加到模型Comment 和与User 模型相关的模型Post,如下所示:

from django.conf import settings
...
class Post(models.Model):
    ...
    user = models.OneToOneField(settings.User, related_name="posts")
    ...

class Comment(models.Model):
    ...
    user = models.OneToOneField(settings.User, related_name"comments")
    post = models.ForeignKey(Post, related_name="post_comments")
    ...

对于您的查询集,您将能够做到:

User.objects.get(posts__id=3)
for comments in Comment.objects.get(post_comments__id=3):
    comments.user # this are the user that commented on a certain post.

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2019-08-07
    • 2016-05-19
    • 2011-11-03
    • 2016-05-27
    • 1970-01-01
    • 2016-04-14
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多