Python django guardian的替代方案为用户获取对象
我们正在一个项目中成功地使用django guardian和django rest框架。但是,当用户拥有1000个具有所需权限集的对象时,为具有特定权限的特定用户获取对象的标准方法似乎非常慢 它在子句中生成一个包含1000个ID的查询。当考虑到web服务器和数据库服务器之间的网络延迟时,这似乎会产生后续影响:从数据库中提取1000个ID,解析它们,然后在子句中的Python django guardian的替代方案为用户获取对象,python,django,django-rest-framework,django-guardian,Python,Django,Django Rest Framework,Django Guardian,我们正在一个项目中成功地使用django guardian和django rest框架。但是,当用户拥有1000个具有所需权限集的对象时,为具有特定权限的特定用户获取对象的标准方法似乎非常慢 它在子句中生成一个包含1000个ID的查询。当考虑到web服务器和数据库服务器之间的网络延迟时,这似乎会产生后续影响:从数据库中提取1000个ID,解析它们,然后在子句中的中将它们发送回数据库 是否有任何记录在案的解决办法?通过使用get\u objects\u for\u user方法,将object\u
中将它们发送回数据库
是否有任何记录在案的解决办法?通过使用get\u objects\u for\u user
方法,将object\u pk
列更改为整数,我可以使用一个内联select语句运行它:
select ... from my_table where ... and id in (select id from guardian...
与当前声明相比:
select id from guardian_userobjectpermissions where ...
... generate list of ids in python ...
select ... from my_table where ... and id in ([big list of ids])
我还没有尝试的另一个解决方法是以某种方式减少guardian获取的ID的范围。e、 g.一个用户有1000个对象,但我只对过去6个月的对象感兴趣。目前,它获取所有可能的对象ID,并为用户提供正确的权限,而不是以任何方式对其进行限制。我知道这是两年前发布的,您很可能以某种方式解决了这个问题,但我刚刚遇到了同样的问题,并在搜索中提出了这个问题。我没有一个纯粹的ORM解决方案,但如果您愿意使用原始SQL,您可以非常高效地完成这项工作。SQL语句如下所示
SELECT
obj.*
FROM guardian_userobjectpermission as op
JOIN auth_user as u ON (op.user_id = u.id)
JOIN auth_permission as p ON (op.permission_id = p.id)
JOIN django_content_type as ct ON (ct.id = op.content_type_id)
JOIN myapp_mymodel as obj ON (obj.id = op.object_pk::integer)
WHERE u.id = user_id AND p.codename = 'mymodel_perm' AND ct.model = 'mymodel' AND ct.app_label = 'myapp'
一个名为MyModel的模型位于一个名为myapp的应用程序中,拥有一个名为MyModel\u perm的权限,并且user\u id是您正在查找对象的用户的主键。对不起,我帮不上忙,但我遇到了同样的问题。特别是cancan101的分析