避免Django中获取用户和权限的N+1问题



我需要获取一个用户列表和每个用户拥有的权限列表(守护对象权限(。问题是,我试图做到这一点的每一种方式都会遇到N+1问题。我是否只是简单地循环浏览用户列表并从设置的获得权限

for user in User.objects.all():
data = UserSerializer(user).data
data['permissions'] = PermissionSerializer(user.userobjectpermission_set, many=True)

或者如果我使用prefetch_related((

for user in User.objects.prefetch_related('userobjectpermission_set'):
data = UserAndPermSerializer(user).data

它最终首先获取用户列表,然后为每个用户运行单独的权限查询。

我可以编写一个原始SQL语句并自己进行序列化,但我更愿意使用现有的序列化程序,因此我希望将用户和权限作为模型实例。有什么方法可以使用ORM完成我需要的吗?

Django的版本是1.11 LTS,我不能很快升级到2.x。

如果您优先考虑数据库读取,而不是可读性、可维护性和开发人员效率,那么您可以通过两次读取来做到这一点:

  • 读取所有用户:User objects.all((
  • 读取所有权限:Permission.objects.all((

然后将权限缝合到应用程序级别的用户。

这很糟糕,但它在数据库读取方面很有效

相关内容

  • 没有找到相关文章

最新更新