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



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

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在users我应该检查user是否存在于model 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)

提前感谢你的帮助,干杯。

你就快成功了!要将用户设置为文件夹,可以使用m2mset将所有用户添加到文件夹中,如下所示:

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的实例,所以这应该可以工作。

最新更新