如何访问反向关系django的反向关系

时间:2018-01-26 00:33:09

标签: python django python-3.x django-models django-queryset

我决定尝试让所有其他用户回复与给定回复相同的评论。我已经提出了以下python,但是我担心这将会进行多个数据库调用。

other_repliers = [other_reply.user for other_reply in my_reply.comment.replies.filter()]

我正在寻找一个db-call修复程序。 Psuedo-SQL逻辑类似于:

SELECT u.*
FROM users AS u
INNER JOIN replies AS r 
   ON r.user = user.id  
WHERE r.comment = {my_reply.comment}
AND r.user != {my_reply.user}

有没有人知道我可以在python django命令链中执行上述SQL的方法?

编辑: 当你忽略任何不是关系的东西时,我的模型看起来像这样:

class Comment(models.Model):
    user = models.ForeignKey(User, related_name='comments')
    listing = models.ForeignKey(Listing, related_name='comments')

class CommentReply(models.Model):
    user = models.ForeignKey(User, related_name='replies')
    comment = models.ForeignKey(Comment, related_name='replies')

class User(models.Model):
     pass

编辑:我希望收集以下图表中的最后一栏:

         /--- r4 --- u4
        /
r1 --- c1 --- r3 --- u3
        \
         \--- r2 --- u2
          *
           ** r1  

其中r *是请求,c *是注释,u *是用户 并且加星号表示忽略r1(因为它用于查找其他r * s)。

3 个答案:

答案 0 :(得分:2)

您还可以使用select_related()

replies_with_users = CommentReply.objects.filter(comment_id=my_reply.comment_id) \
                                         .exclude(user=my_reply.user) \
                                         .select_related('user')

users = [reply.user for reply in replies_with_users]

这使用连接来检索单个查询中的所有用户。列表理解只是将那些已经检索过的用户重新打包成用例所需的格式。

旁注:如果您担心检索(但不使用)可能较大的评论正文,则可以始终将.defer('body_field_name')添加到查询中。您还可以使用双下划线表示法推迟用户的未使用字段(如果需要)。

答案 1 :(得分:1)

我不确定使用django-API的单个查询是否可行,但是应该可以使用两个查询。您的共同元素是Comment。首先让我们得到所有回复r1,r2,r3,r4,...到这个评论:

all_replies = CommentReply.objects.filter(comment=my_reply.comment)

现在我们只需要来自这些回复的用户

users = User.objects.filter(replies__in=all_replies)

答案 2 :(得分:0)

我发现以下django命令链,可以提供更优雅的解决方案吗?

User.objects.filter(id__in=my_reply.comment.replies.values_list('user_id')) \
             .exclude(id=my_reply.user)

然而,这看起来像是对我的两个查询。