2012-03-15 5 views
0

Я пытаюсь ограничить результаты, перекрываяФильтр Queryset для django ManyToManyField?

def queryset(self, request): 

в ItemAdmin.

Я хочу отображать только те элементы, для которых request.user предоставлен доступ к категории через профиль пользователя.

class Profile(models.Model): 
    user = models.ForeignKey(auth.User, unique=True) 
    categoryAccess = models.ManyToManyField(Category ...) 

class Item(models.Model): 
    category = models.ForeignKey(Category ...) 

Я совсем не могу получить правильный синтаксис .... Я пытаюсь что-то вроде

class ItemAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(ItemAdmin, self).queryset(request) 
     return qs.filter(category__in=request.user.objects__profile__categoryAccess) 

Любые идеи? Большое спасибо!

ответ

2

Синтаксис с двойным подчеркиванием в фильтрах используется только в левой части выражения (это хак, чтобы обойти тот факт, что это фактически аргумент ключевого слова для функции, и они не могут быть выражениями) , Правый использует обычный синтаксис для обхода объектов: . Таким образом, вы, вероятно, хотите это:

return qs.filter(category__in=request.user.profile.categoryAccess.all()) 

Обратите внимание, что, чтобы сделать эту работу, вы должны превратить ваш user ForeignKey в OneToOneField (вы не должны мигрировать база данных, просто измените определение модели).

+0

Эй, Даниэль! Большое спасибо ... Я изменил поле на OneToOne, но я получаю «Запрос соответствия профиля не существует». – cssndrx

+0

Ох! На самом деле это плохо. Код сломался, потому что у пользователя не было профиля при его создании. Можно ли просто поймать это исключение и вернуть пустой список? Спасибо за исправление :) – cssndrx

+1

Просто чтобы подтвердить ... обратное отношение user.profile будет работать, правильно? Я видел, что в документации обратные отношения возможны с синтаксисом __. Однако, когда я создаю профиль, а затем пытаюсь фильтровать: я получаю нетрадиционную ошибку Django. В нем говорится: «Ошибка базы данных: что-то не так с вашей установкой базы данных. Убедитесь, что созданы соответствующие таблицы базы данных и убедитесь, что база данных читается соответствующим пользователем». Кто-нибудь видел это раньше? – cssndrx

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