У меня есть 2 модели, которые подключены как ManyToMany, как вы можете видеть ниже. То, что я пытаюсь достичь, это;обслуживать пользователей для пользователей только тогда, когда у пользователя есть хотя бы право просмотра списка, которому принадлежит этот человек.
Вот мои упрощенные модели;
class List(TimeStampedModel, UserAwareModel):
"""Model definition for List."""
name = models.CharField(_('list name'), max_length=50)
...
class Person(TimeStampedModel, UserAwareModel):
"""Model definition for Person."""
member = models.ManyToManyField(List, blank=True)
...
Вот мои мои взгляды;
class ListViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows Lists to be viewed or edited.
"""
queryset = List.objects.all()
serializer_class = ListSerializer
permission_classes = (CustomObjectPermissions, DjangoModelPermissions)
filter_backends = (filters.DjangoObjectPermissionsFilter,)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class PersonViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows People to be viewed or edited.
"""
# queryset = Person.objects.all().order_by('-created')
serializer_class = PersonSerializer
permission_classes = (DjangoModelPermissions, )
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def get_queryset(self):
user = self.request.user
allowed_lists = get_objects_for_user(user, ('view_list'), klass=List)
queryset = set()
for lst in allowed_lists:
queryset.add(Person.objects.filter(member=lst))
return queryset
Обновление: Благодаря mehamasum.Обновите трассировку с последней (и, похоже, больше связано с моим переопределением get_queryset)
Обновление 2: Еще раз спасибо mehamasum.Теперь мой код работает без каких-либо ошибок, но мой тестовый пользователь, который имеет доступ только к просмотру в «Списке 1», по-прежнему получает всех пользователей (даже принадлежащих другим спискам) в конечной точке пользователей.- Что не так с кодом? -
Обновление 3: Появилось get_obejcts_for_user Функция не возвращает результаты должным образом, как Mehamasum упоминается в комментариях.Все еще ищу причину.