Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django guardian的替代方案为用户获取对象_Python_Django_Django Rest Framework_Django Guardian - Fatal编程技术网

Python django guardian的替代方案为用户获取对象

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

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

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

是否有任何记录在案的解决办法?通过使用
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的分析