如果对象是私有的,则排除对象

时间:2016-04-21 18:18:30

标签: python django django-models django-orm

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

qs = Post.objects.all()

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

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

1 个答案:

答案 0 :(得分:2)

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

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允许您构建更复杂的查询,如果您不熟悉,可以将上述查询读作“公共帖子或属于该用户的私人帖子”