【问题标题】:Exclude object if object is private如果对象是私有的,则排除对象
【发布时间】:2016-04-21 18:18:30
【问题描述】:

如果该对象的布尔字段设置为 true,我如何从查询集中删除该对象?我需要将其从查询集中删除,因为稍后我将使用 DRF 对其进行序列化。

qs = Post.objects.all()

for post in qs:
    if post.private == True and post.user.pk != request.user.pk:
        post.remove()

我不能使用exclude(),因为我需要条件来检查对象(用户)的所有者是经过身份验证的所有者以及对象是否设置为私有。

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    不要拉所有帖子,然后删除不属于用户的私人帖子,而是拉所有公共帖子并添加用户可以看到的私人帖子。

    from django.db.models import Q
    
    if request.user.is_authenticated():
        # Return public (private=False), and private posts of the user
        visible_posts = Post.objects.filter(Q(private=False) |
                                            Q(private=True, user=request.user))
    else:
        # Only return public posts
        visible_posts = Post.objects.filter(private=False)
    

    如果您没有经过身份验证的用户,只需

    Q 允许您形成更复杂的查询,如果您不熟悉,可以将上述查询理解为“属于用户的公开帖子或私人帖子”

    【讨论】:

    • 这会在 AnonymousUser 上引发异常
    • 如果匿名用户只发布公开帖子,Post.objects.filter(private=False)
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多