Джанго: Сложные параметры фильтра или ...? - PullRequest
1 голос
/ 12 апреля 2010

Этот вопрос связан с другим моим вопросом , но я немного изменил логику.

У меня есть такие модели:

from django.contrib.auth.models import Group

class Category(models.Model):
   (...)
   editors = ForeignKey(Group)

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

Теперь, скажем, пользовательзаходит в админку и хочет изменить запись.Как мне ограничить список записей только теми, которые он имеет право редактировать?Я имею в виду: как я могу перечислить только те записи, которые относятся к категории, которая в своем поле «редакторы» имеет одну из групп, к которой принадлежит пользователь?

Что если пользователь принадлежит к нескольким группам?Мне все еще нужно показать все соответствующие записи.

Я попытался поэкспериментировать с методами changelist_view () и queryset (), но эта проблема для меня слишком сложна.

Мне также интересно, granular-permissions может помочь мне с этой задачей, но пока я понятия не имею.

Я придумал только вот что: сначала я получаю список всех групп, к которым принадлежит пользователь.Затем для каждой группы я получаю все связанные категории, а затем для каждой категории я получаю все записи, которые принадлежат этим категориям.К сожалению, я не знаю, как соединить все вместе в качестве параметров filter (), чтобы получить хороший одиночный QuerySet.

EDIT:

Я пытался использовать MultiQuerySet следующим образом:

class EntryAdmin(admin.ModelAdmin):

    (...)

    def queryset(self, request):
        qs = super(EntryAdmin, self).queryset(request)
        if not request.user.is_superuser:
            groups = request.user.groups.all()
            list = []
            for group in groups:
                categories = Category.objects.filter(editors=group)
                for category in categories:
                    results = qs.filter(category=category)
                    list.append(results)
            qs = MultiQuerySet(*list)
        return qs

но я получаю ошибку базы данных в представлении администратора (НЕ ошибка Django; отображается обычная страница администратора, но вместо списка есть «Ошибка базы данных»)

1 Ответ

3 голосов
/ 12 апреля 2010

Вы можете попробовать использовать оператор __in:

qs = Category.objects.filter(editors__in=request.user.groups.all())
...