2015-03-08 4 views
0

Как я могу использовать select_related для user_permissions? Я попыталсяDjango select_related user_permissions

select_related('user,' 'user__user_permission') 

, но похоже, что он все еще ищет в базе данных, когда я использую self.has_perm('forums.can_moderate') на объекте пользователя.

ответ

1

Метод 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.

Смежные вопросы