【问题标题】:Django best practices for creating private user groupsDjango 创建私有用户组的最佳实践
【发布时间】:2019-10-01 15:56:50
【问题描述】:

我正在创建一个群组应用,我希望它只是邀请,但我想知道是否有更好的方法来做到这一点。此设置工作正常,但如果有人看到我可能遇到的任何问题,请告诉我。我已经包含了与邀请相关的模型和视图,这应该可以让您很好地了解我在这里的思考过程。

models.py

Account = get_user_model()


class FriendGroup(models.Model):
    owner = models.ForeignKey(
        Account, on_delete=models.SET_NULL, related_name="group_owner", null=True)
    name = models.CharField(max_length=50)
    description = models.TextField(blank=True, null=True)
    administrators = models.ManyToManyField(
        Account, related_name="group_admin")
    members = models.ManyToManyField(Account, related_name="group_member")
    thumbnail = models.ImageField(upload_to='images/groups/', blank=True)
    image_lg = models.ImageField(upload_to='images/groups/', blank=True)
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class GroupInvite(models.Model):
    group = models.ForeignKey(
        FriendGroup, on_delete=models.CASCADE, related_name="invite")
    sender = models.ForeignKey(
        Account, on_delete=models.CASCADE, related_name="sent_by")
    invitee = models.ForeignKey(
        Account, on_delete=models.CASCADE, related_name="invitee")

    def __str__(self):
        return "Join " + self.group.name

views.py

class SendGroupInvitesView(APIView):

    def post(self, request, pk, format=None):
        group = FriendGroup.objects.filter(id=pk)
        invitees = request.data.get('invitees')
        if group.exists():
            if request.user in group[0].members.all():
                if invitees:
                    for invitee in invitees:
                        account = Account.objects.filter(id=invitee)
                        if account.exists():
                            invite = GroupInvite.objects.create(
                                group=group[0], sender=request.user, invitee=account[0])
                            invite.save()
                    return Response({'success': 'Invites sent.'}, status=status.HTTP_201_CREATED)
                return Response({'error': 'You must invite at least one friend.'}, status=status.HTTP_400_BAD_REQUEST)
        return Response({'error': 'Group does not exist.'}, status=status.HTTP_400_BAD_REQUEST)


class AcceptGroupInviteView(APIView):

    def post(self, request, pk, format=None):
        invite = GroupInvite.objects.filter(id=pk, invitee=request.user)
        if invite.exists():
            invite = invite[0]
            group = invite.group
            group.members.add(request.user)
            group.save()
            invite.delete()
            return Response({'success': 'Joined group.'}, status=status.HTTP_201_CREATED)
        return Response({'error': 'Invite does not exist.'}, status=status.HTTP_400_BAD_REQUEST)


class DeleteGroupInviteView(APIView):

    def post(self, request, pk, format=None):
        invite = GroupInvite.objects.filter(id=pk)
        if invite.exists():
            if invite[0].invitee == request.user or request.user in invite[0].group.members.all():
                invite = invite[0]
                invite.delete()
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response({'error': 'You are not authorized to delete this invite.'}, status=status.HTTP_401_UNAUTHORIZED)
        return Response({'error': 'Invite does not exist.'}, status=status.HTTP_400_BAD_REQUEST)

我知道我的代码可能看起来有点草率,可能会让经理来清理一下。

【问题讨论】:

    标签: python django server django-rest-framework backend


    【解决方案1】:

    我不知道你们在这项任务中的所有要求。但是,在我看来,您不应该为此使用两个 m2m 字段。 M2M 关系运行速度不快,因此最好减少它的数量。看看中间模型。可以通过附加字段为成员获取管理员权限。

    class GroupMembers(models.Model):
        group = models.ForeignKey(FriendGroup...)
        member = models.ForeignKey(Account...)
        is_admin = models.BooleanField(default=False)
    
    
    class FriendGroup(models.Model):
        ...
        members = models.ManyToManyField(Account, through=GroupMembers)
        ...
    

    请参阅https://docs.djangoproject.com/en/2.2/topics/db/models/#extra-fields-on-many-to-many-relationships 上的文档

    【讨论】:

    • 我喜欢这种方法,它更有意义,谢谢
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2016-04-30
    • 2014-07-11
    相关资源
    最近更新 更多