Python 基于另一查询集筛选查询集
我有一个名为UserCommunityProfiles的模型,其结构如下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
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)