-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。

4

1 回答 1

0

如果您将数据库读取优先于可读性、可维护性和开发人员效率等事项,那么您可以通过两次读取来执行此操作:

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

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

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

于 2018-11-03T00:30:11.297 回答