Как просматривать других членов группы, если я являюсь членом этой группы?

В моем мобильном приложении я пытаюсь создать систему, с помощью которой я могу найти других членов группы, которые уже являются членами групп, в которых я состою. Но я могу найти только себя, а не их. Как я могу это сделать?

Примечание: Я могу получить их из GroupViewSet, в котором я нахожусь, но я должен получить доступ к ним в GroupMemberViewSet, так что если я являюсь администратором этой группы, я могу изменить членство в группе.

Models.py

class User(AbstractUser,PermissionsMixin):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.CharField(max_length=255,unique=True)
    username =models.CharField(max_length=40,unique=True,default='undefinedusername')

class Group(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50,blank=True)

class GroupMember(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='groupmembers')
    group = models.ForeignKey(Group,on_delete=models.CASCADE,related_name='groupmembers_set')
    isadmin =  models.BooleanField(default=False)
    ismod =  models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now_add=True)

Views.py

class GroupMemberViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = GroupMember.objects.all().order_by('-timestamp')
    serializer_class = GroupMemberSerializer
    filter_backends = [UserFilterBackend]

Filters.py

class UserFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(author=request.user)

Вы можете фильтровать набор запросов с помощью:

class SameGroupBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.exclude(
            pk=request.user.pk
        ).filter(
            groupmembers__group__groupmembers_set__author=request.user
        ).distinct()

Это позволит получить все User, которые имеют хотя бы одну общую группу с request.user. Мы .exclude(pk=request.user.pk) хотим исключить вошедшего в систему пользователя (вы можете опустить эту часть, если вошедший в систему пользователь должен быть включен).

Возможно, было бы более элегантно протянуть ManyToManyField между Group и User, а затем сделать запросы с этим отношением "многие ко многим". Тогда это будет выглядеть так:

from django.conf import settings

class Group(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50,blank=True)
    users = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='groups',
        through='GroupMember'
    )

параметр through=… [Django-doc] указывает, что вы используете модель в качестве таблицы перехода.

Используя такие ManyToManyField, мы можем упростить фильтрацию до:

class SameGroupBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.exclude(
            pk=request.user.pk
        ).filter(
            groups__users=request.user
        ).distinct()
Вернуться на верх