Python 基于另一查询集筛选查询集

Python 基于另一查询集筛选查询集,python,django,django-queryset,Python,Django,Django Queryset,我有一个名为UserCommunityProfiles的模型,其结构如下 class UserCommunityProfile(models.Model): owner = models.ForeignKey( User, on_delete = models.CASCADE) (...) 还有一个叫做订阅结构的模型: class subscriptions(models.Model): subscriber = models.Forei

我有一个名为UserCommunityProfiles的模型,其结构如下

class UserCommunityProfile(models.Model):
    owner = models.ForeignKey(
        User,
        on_delete = models.CASCADE)
    (...)
还有一个叫做订阅结构的模型:

class subscriptions(models.Model):
    subscriber = models.ForeignKey(
        User,
        on_delete = models.CASCADE, related_name='subscriber'
    )
    subscribed_to = models.ForeignKey(
        User,
        on_delete = models.CASCADE, related_name='subscribed_to'
    )
我试图实现的是将不在查询集subscriptions中的每个用户的配置文件显示为subscribed to,并且订阅者是
request.user

我所做的就是我所做的

subs = subscriptions.objects.filter(subscriber=request.user)
profiles = UserCommunityProfile.objects.exclude(owner=subs)

但是我得到一个错误,说
不能将QuerySet用于“订阅”:将QuerySet用于“用户”。
我应该怎么做

可以使用
QuerySet
s来过滤其他
QuerySet
s,但正如这里的错误所说,您使用
owner
s,这意味着它希望使用一个包装
用户的
QuerySet
,但这里您提供了一个包含
订阅的
QuerySet

但是,我们可以使用以下查询:

subs = User.objects.filter(subscribed_to__subscriber=request.user)
profiles = UserCommunityProfile.objects.exclude(owner__in=subs)
因此,这将提供一个
QuerySet
,其中包含所有
UserCommunityProfile
s,这些文件没有
Subscriptions
,其中
owner
订阅的
用户,而
subscriber
self.request.user

如果您像上面演示的那样“组合”查询集,那么通常这将导致一个查询。这通常效率更高,因为所有处理都是在数据库级别完成的,并且数据库针对此类任务进行了优化

但是,在某些情况下,情况可能并非如此,例如,如果一个条件有两个不相交的条件,并且每个条件都会产生一个(独立的)
JOIN
s列表,那么最好使用例如
UNION
重写查询。但这里的情况并非如此。

解决方案:

subs=User.objects.filter(subscribed_to__subscriber=request.user).values_list('id')
profiles = UserCommunityProfile.objects.exclude(owner__in=subs)

我觉得最后几行的格式有点“怪异”,你能不能把它修好,这样我们就可以看看它是否正确,然后向上投票:)对不起,我现在已经格式化了代码。询问是否有任何混淆。是否有可能存在多个订阅,其中
请求。用户
订户
。通过使用
.first()
可能不考虑其他选项:s.如果是这种情况,则必须执行subs=User.objects.filter(subscribed\u subscriber=request.User)。values\u list('id')profiles=UserCommunityProfile.objects.exclude(owner\u in=subs)我认为在答案中加上这一点可能是值得的:)
subs=User.objects.filter(subscribed_to__subscriber=request.user).values_list('id')
profiles = UserCommunityProfile.objects.exclude(owner__in=subs)