2009-06-22 4 views
1

Я использую модель разрешения на уровне строк, известную как django-гранулярные разрешения (http://code.google.com/p/django-granular-permissions/). У модели разрешения просто есть только два поля, которые являются типом содержимого и идентификатором объекта.Запрос модели Django с настраиваемыми полями выбора

Я использовал следующий запрос:

User.objects.filter(Q(row_permission_set__name='staff') | \ 
    Q(row_permission_set__name='student'), \ 
    row_permission_set__object_id=labsite.id) 

Я хочу, чтобы добавить is_staff и is_student логических полей результирующего набора без запроса каждый раз, когда я получить результат.

Документация Django показывает метод запросов(), но я не могу понять, что я должен написать для простого запроса выбора SQL с этим отношением.

Как это сделать?

+0

Что случилось с включением этой квалификации в каждом запросе? У вас проблемы с производительностью? –

+0

Нет, запрос выше полностью в порядке. Но я хотел бы добавить дополнительные поля is_staff и 'is_boolean' к объектам набора результатов. – Achimnol

ответ

5
.extra(select={'is_staff': "%s.name='staff'" % Permission._meta.db_table, 'is_student': "%s.name='student'" % Permission._meta.db_table, }) 
+0

Работает очень хорошо. :) – Achimnol

+0

Я ошибочно проголосовал за это. Ограничение времени перешло к тому, где я могу вносить какие-либо изменения, если отредактирован ответ. Если вы производите изменения, я исправлю свою ошибку до голосования. Ура! –

0

Обычно вы используете select_related() для таких вещей, но, к сожалению, это не работает в обратных отношениях. Что вы можете сделать, это включить запрос вокруг:

users = [permission.user for permission in Permission.objects.select_related('user').filter(...)] 
+0

В вашем запросе, как я могу определить, у каждого пользователя есть какое-то разрешение или нет? (особенно в удобной форме для шаблонов) – Achimnol

+0

Из-за фильтра на объектах Permission (вы просто отфильтровываете требуемые разрешения) все ваши пользователи в списке будут иметь необходимые разрешения. Если все, что вам нужно сделать, это отобразить пользователей с требуемыми разрешениями, это проще, чем .extra(). Если вам нужно перечислить * всех * пользователей, а затем сделать конкретные вещи для тех, кто имеет некоторые разрешения, то extra() - это путь. – oggy

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