如何修复使用Django REST Framework(API)将用户添加到组的问题

时间:2019-07-30 13:49:58

标签: django api django-models django-rest-framework django-views

我正在尝试构建一个储蓄API,只要用户不超过最大成员数,用户就可以获取可用的组列表并加入该组。我尝试了一系列方法,但似乎不起作用,每次尝试将用户添加到组时,似乎都想添加整个用户属性。

我创建了一个组模型,并通过ManytoMany字段将其连接到用户模型,因为用户可以加入多个组,而一个组可以容纳许多用户。我的问题出在序列化程序上,无论何时尝试添加用户

groups.model

class Groups(models.Model):
    name = models.CharField(max_length = 50, unique = True)
    group_id = models.UUIDField(default = uuid.uuid4, editable = False)
    max_no_members = models.PositiveIntegerField()
    savings_amount = models.PositiveIntegerField()
    savings_type = models.CharField(max_length = 10, default = 'Monthly')
    description = models.TextField(blank=True)
    begin_date = models.DateField()
    created_date = models.DateTimeField(auto_now_add=True)
    searchable = models.BooleanField(default = True)
    members = models.ManyToManyField(User, related_name='group_members')
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete 
    =models.CASCADE,related_name='group_admin' )

    def __str__(self):
        return self.name

groups.serializer

#List of Memebers
class GroupMembersListSerializer(serializers.HyperlinkedModelSerializer):
    # users = UserSerializer(many=True, read_only = True)
    class Meta:
        model = Groups
        fields = ['members','name']

#Join a Group
class JoinGroupSerializer(serializers.ModelSerializer):
    users_to_join = UserSerializer(many=True, read_only = True, source = 
    'User')
    class Meta:
        model = Groups
        fields = ['members','users_to_join']

groups.views

#Create Group
class GroupCreateAPIView(CreateAPIView):
    queryset = Groups.objects.all()
    serializer_class = GroupCreateSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        serializer.save(created_by= self.request.user, members = 
        [self.request.user])
#Members list Group
class GroupMembersList(RetrieveAPIView):
    queryset = Groups.objects.all()
    serializer_class = GroupMembersListSerializer

    permission_classes = [IsAuthenticated,IsOwnerOrReadOnly]

#Join Group
class GroupJoinAPIView(CreateAPIView):
    queryset = 
    Groups.objects.annotate(arr=ArrayAgg('members')).values_list('id', 'arr')
    serializer_class = JoinGroupSerializer

    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        print(sys.stderr, self.queryset)
        if self.request.user.id in self.queryset.all():
            return 'User already in the group'
        else:
            list(self.queryset.all()).append(self.request.user.id)
            serializer.save()

0 个答案:

没有答案