我决定尝试让所有其他用户回复与给定回复相同的评论。我已经提出了以下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)。
答案 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)
然而,这看起来像是对我的两个查询。