Django DRF 嵌套关系 - 如何在 ManyToMany 字段中添加对象

Django DRF nested relationships - how to add objects in a ManyToMany field

我正在使用 DRF 构建 API。我有两个模型,文件夹和用户,通过 ManyToMany 字段连接。

models.py

class Folder(models.Model):
    title = models.CharField(max_length=20)
    description = models.CharField(max_length=250)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
    users = models.ManyToManyField(User, related_name='folders')

    def __str__(self):
        return self.title
class User(AbstractBaseUser, PermissionsMixin):
    username = None
    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    organization = models.ForeignKey(
        Organization, on_delete=models.CASCADE, null=True, blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email

serializers.py

class FolderSerializer(serializers.ModelSerializer):

    class Meta:
        model = Folder
        fields = ("id", "title", "description", "users", "organization")

    def create(self, validated_data):
        users = validated_data.pop('users') if 'users' in validated_data else []
        folder = Folder.objects.create(**validated_data)
        for user in users:
            if user in User.objects.all():
                User.objects.filter... **not sure**
            else  
                User.objects.create(folder=folder, **user)
        return folder

我坚持的部分是自定义创建方法:基本上,用户不会在创建文件夹时创建,他们只是被添加到新创建的文件夹中,所以我认为在 for 循环中 for user in users 我应该检查用户是否存在于模型 User 的实例中,如果存在,我应该更新它的 属性 文件夹。 不过我不知道该怎么做。

此外,我不确定这是否是实现我所需的正确方法:可以添加到文件夹的用户列表。每个文件夹可以有多个用户,每个用户可以在多个文件夹中。

顺便说一句,我也确实在视图中自定义了 POST 请求,但它不起作用。我将其添加到此处只是为了提供当前代码的完整概述。

views.py

class FolderViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAuthenticated, ]
    serializer_class = FolderSerializer

    def get_queryset(self):
        a = Folder.objects.filter(
            organization=self.request.user.organization)
        b = a.filter(users__id=self.request.user.id)
        return b.order_by('title')

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        folder = serializer.save(users=[].append(self.request.user), organization=self.request.user.organization)
        return Response(FolderSerializer(folder, context=self.get_serializer_context()).data)

非常感谢您的帮助,干杯。

你就快完成了!要将用户设置到文件夹,您可以使用 m2m set 将所有这些用户添加到文件夹,如下所示:

    def create(self, validated_data):
        users = validated_data.pop('users') if 'users' in validated_data else []
        folder = Folder.objects.create(**validated_data)
        folder.users.set(users)
        return folder

我相信 users 这里已经有 User 的实例,所以这应该有效。