Фильтр Queryset для django ManyToManyField? - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь ограничить результаты переопределением

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 )

Есть идеи? Большое спасибо!

1 Ответ

2 голосов
/ 15 марта 2012

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

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

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

...