django 不支持在union()之后调用QuerySet.only()

qyzbxkaa  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(180)

我是个新手。
我在我的django后端得到以下错误:
不支持在union()之后调用QuerySet.only()
产生错误的代码如下:

post_notification_target_users = Post.get_post_comment_notification_target_users(post=post,
                                                                                     post_commenter=post_commenter).only(
        'id', 'username', 'notifications_settings__post_comment_notifications')

我搜索了上面使用.union()的地方,这是我发现的:

def get_post_comment_notification_target_users(cls, post, post_commenter):
    """
    Returns the users that should be notified of a post comment.
    This includes the post creator and other post commenters
    :return:
    """

    # Add other post commenters, exclude replies to comments, the post commenter
    other_commenters = User.objects.filter(
        Q(posts_comments__post_id=post.pk, posts_comments__parent_comment_id=None, ) & ~Q(
            id=post_commenter.pk))

    post_creator = User.objects.filter(pk=post.creator_id)

    return other_commenters.union(post_creator)

我读了其他堆栈帖子,在使用union()后什么是允许的,什么是不允许的,但我无法找到正确的方法来做。

c0vxltue

c0vxltue1#

最简单的方法是在调用union()之前使用only()调用

other_commenters = User.objects.filter(
    Q(posts_comments__post_id=post.pk, 
      posts_comments__parent_comment_id=None, 
    ) & ~Q(id=post_commenter.pk)
    ).only(
    'id', 'username', 'notifications_settings__post_comment_notifications')

post_creator = User.objects.filter(pk=post.creator_id).only(
    'id', 'username', 'notifications_settings__post_comment_notifications')

return other_commenters.union(post_creator)

因为你是在相同的对象类型(用户)上过滤,你也可以扩展你的初始查询,使用括号来指示优先级,并完全避免union()。

users_to_notify = User.objects.filter(
    (
        Q(posts_comments__post_id=post.pk, 
          posts_comments__parent_comment_id=None, 
         ) & ~Q(id=post_commenter.pk)
    ) | Q(pk=post.creator_id)
)
return users_to_notify

注意:如果你确定post_creator不会出现在other_commenters中,你也可以完全避免使用OR操作符union()。

return other_commenters | post_Creator

相关问题