根据其他查询筛选查询集

2024-09-30 12:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class UserCommunityProfile(models.Model):
    owner = models.ForeignKey(
        User,
        on_delete = models.CASCADE)
    (...)

还有一个叫做订阅结构的模型:

^{pr2}$

我要实现的是显示每个不在查询集订阅中的用户的配置文件,该用户是request.user

我所做的是我所做的

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

但是我得到一个错误,说Cannot use QuerySet for "subscriptions": Use a QuerySet for "User".我该怎么办?在


Tags: 用户模型forobjectsmodelsrequestsubscriptions结构
2条回答

解决方案:

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

可以使用QuerySets来过滤其他的QuerySet,但正如这里的错误所说,您使用owners,这意味着它希望与包装Users的QuerySet一起工作,但是这里提供了一个包含{}的{}。在

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

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

此外,我们确实需要两个QuerySet,我们可以这样查询:

^{pr2}$

因此,这将提供一个QuerySet,其中包含所有UserCommunityProfile,其中{}是subscribed_to,而{}是{}。在

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

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

相关问题 更多 >

    热门问题