Метод select_related
работает только с отношениями many_to_one или one_to_one (с которыми может быть только одна цель). Итак, для начала, вы не можете использовать select_related
для предварительной загрузки нескольких разрешений. Для этого вы должны посмотреть на prefetch_related
.
У вас есть два варианта:
- Либо вы на самом деле нужно знать все (или большинство) разрешения, и вы используете
prefetch_related
.
- Или вам нужно только проверить несколько разрешений и отфильтровать их вручную.
В любом случае метод has_perm
не будет использовать предварительно загруженные данные. Вы хотите проверить, какие объекты разрешений вы загружаете вручную. При использовании первого подхода:
qs = MyModel.objects.prefetch_related('user__user_permissions')
for obj in qs:
for permission in obj.user.user_permissions.all():
print('On object %d, permission %s' % (obj.pk, permission.codename))
Использование второго подхода:
qs = MyModel.objects.filter(user__user_permissions__codename='can_moderate')
for obj in qs:
print('Object %s has a user with permission can_moderate' % obj.pk)
Просто, чтобы убедиться: это не связано с объектно-ориентированной разрешения. Он просто фильтрует объекты, связанные с пользователем, который имеет общее разрешение can_moderate (для всех объектов). Для объектных разрешений вам нужен сторонний модуль, например django-guardian.