Этот вопрос связан с другим моим вопросом , но я немного изменил логику.
У меня есть такие модели:
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; отображается обычная страница администратора, но вместо списка есть «Ошибка базы данных»)