Skip to main content
 首页 » 编程设计

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

2024年08月16日39davidwang456

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

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

我正在寻找单数据库调用修复程序。 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)。

请您参考如下方法:

您还可以使用 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') 插入询问。您还可以使用双下划线符号延迟用户未使用的字段(如果需要)。