我们在一个项目中成功地使用了django-guardian和django-rest-framework。然而,当用户有1000个具有所需权限集的对象时,为具有特定权限的特定用户获取对象的标准方法似乎非常慢。
它在一个IN子句中生成一个具有1000个It的查询。当考虑到web服务器和数据库服务器之间的网络延迟时,这似乎具有后续影响:从数据库中提取1000个in,解析它们,然后在IN子句中将它们发送回数据库。
有没有记录在案的解决方法?通过修改get_objects_for_user方法并将object_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获取的ids的范围。例如,一个用户有1000个对象,但我只对过去6个月的对象感兴趣。目前,它为用户获取具有正确权限的所有可能的对象in,而不是以任何方式限制它。
发布于 2018-09-08 05:15:34
我知道这是两年前发布的,你很可能已经以某种方式解决了这个问题,但我在搜索中遇到了同样的问题,并提出了这个问题。我没有纯粹的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_perm的权限,user_id是您正在查找对象的用户的主键。
https://stackoverflow.com/questions/34370898
复制相似问题