我有一个包含多个网站的系统。系统中的每个User对象都会获得一个附加到其上的Profile对象,该对象管理他们有权与之交互的站点。系统还有一个Article模型,可以属于多个站点。因此,当用户加载文章管理页面时,我只希望他们看到分配给他们有权访问的网站的文章。因此,我使用以下内容覆盖Article的Admin类上的queryset方法:
qs = model.objects.filter(sites__id__in=[x.id for x in user.get_profile().group_profile.allowed_sites.all()]).distinct()
获取用户,获取他们有权访问的网站,并提取其网站分配在该列表中的文章。问题是,一旦你获得了数十万篇文章,这个查询就变成了一个真正的狗,并且由于模型本身很大而加剧,这意味着Django正在提取大量数据并在大列列表上运行DISTINCT。
我正在寻找改进它的方法,但是查询集方法似乎并不能给我带来太多帮助。我最初尝试使用QuerySet函数only()来仅绘制我需要绘制变更列表的列,但后来发现这导致模型的post_save信号在保存时不会触发。我无法摆脱不同的区别,因为如果我这样做,我将在每个站点获得多个结果:即,如果用户可以看到站点A和站点B,并且文章属于两个站点,则查询将返回文章两次。
答案 0 :(得分:1)
如果您有ManyToMany关系,则无法摆脱distinct()
,因为必须为每个实例执行多个连接。你可以对你的查询做些什么(虽然我不认为这会带来一些大的性能提升),你不必使用id进行'__in'查询:
qs = model.objects.filter(\
sites__in=user.get_profile().group_profile.allowed_sites.all()).distinct()