Как просматривать других членов группы, если я являюсь членом этой группы?
В моем мобильном приложении я пытаюсь создать систему, с помощью которой я могу найти других членов группы, которые уже являются членами групп, в которых я состою. Но я могу найти только себя, а не их. Как я могу это сделать?
Примечание: Я могу получить их из 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()