首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代django-guardian get_objects_for_user

替代django-guardian get_objects_for_user
EN

Stack Overflow用户
提问于 2015-12-19 20:44:48
回答 1查看 631关注 0票数 2

我们在一个项目中成功地使用了django-guardian和django-rest-framework。然而,当用户有1000个具有所需权限集的对象时,为具有特定权限的特定用户获取对象的标准方法似乎非常慢。

它在一个IN子句中生成一个具有1000个It的查询。当考虑到web服务器和数据库服务器之间的网络延迟时,这似乎具有后续影响:从数据库中提取1000个in,解析它们,然后在IN子句中将它们发送回数据库。

有没有记录在案的解决方法?通过修改get_objects_for_user方法并将object_pk列更改为整数,我能够使用内联select语句使其运行:

代码语言:javascript
复制
select ... from my_table where ... and id in (select id from guardian...

对比以下各项的当前语句:

代码语言:javascript
复制
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,而不是以任何方式限制它。

EN

回答 1

Stack Overflow用户

发布于 2018-09-08 05:15:34

我知道这是两年前发布的,你很可能已经以某种方式解决了这个问题,但我在搜索中遇到了同样的问题,并提出了这个问题。我没有纯粹的ORM解决方案,但如果您愿意使用原始SQL,您可以非常高效地完成这项工作。SQL如下所示

代码语言:javascript
复制
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是您正在查找对象的用户的主键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34370898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档