填充只读嵌套序列化器

问题描述 投票:0回答:2

我正在使用 ModelViewSets,并且我有这些模型的嵌套序列化程序。

class Profile(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    place = models.OneToOneField(Place, on_delete=models.DO_NOTHING)
    bio = models.TextField(null=True)

class User(AbstractBaseUser, PermissionsMixin):
    
    id          = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email       = models.EmailField(_('email address'), unique=True)
    first_name  = models.CharField(max_length=150, blank=True)
    is_staff    = models.BooleanField(default=False)
    is_active   = models.BooleanField(default=False)

    objects = CustomAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name']

    def __str__(self):
        return self.email

更新 我如何自动完成与发送请求的用户 1:1 关系的新创建的配置文件?

所以,你在一个网站上注册,现在你是一个用户,但你想要个人资料,一些个人资料,所以你正在为此设置你的个人资料

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        exclude = ('password', 'is_superuser', 'is_staff', 'groups', 'user_permissions')

class ProfileSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):

    user = UserSerializer(read_only=True)
    place = PlaceSerializer(read_only=True)

    class Meta:
        model = Profile
        fields = '__all__'
        depth = 1

视图集

class ProfileViewSet(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer
    get_queryset = Profile.objects.all()

    def create(self, request):
        serializer = ProfileSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            data = serializer.data
            return Response(data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

如您所见,我正在使用“drf-writable-nested”并且它工作正常但我无法弄清楚如何在创建新配置文件时自动将配置文件连接到用户。

python django django-models django-rest-framework django-serializer
2个回答
1
投票

如果你想使用只读字段,你将有 CurrentUserDefault

user = serializers.PrimaryKeyRelatedField(
    read_only=True, 
    default=serializers.CurrentUserDefault()
)

或者您可以省略用户并在保存序列化程序时传递它,如下所示:

serializer.save(user=request.user)


0
投票

要自动将新创建的配置文件连接到发送请求的用户,您可以修改

create
中的
ProfileViewSet
方法。这是一种方法:

class ProfileViewSet(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer
    queryset = Profile.objects.all()

    def create(self, request):
        # Set the user to the requesting user
        request.data['user'] = request.user.id
        serializer = ProfileSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            data = serializer.data
            return Response(data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在这个更新的

create
方法中,我们首先将传入
request.data
字典中的用户字段设置为发送请求
(request.user.id)
的用户ID。然后我们将这个更新的
request.data
传递给
ProfileSerializer
并创建配置文件对象。
user
字段将自动填充发送请求的用户 ID,因为我们在上一步中设置了它。

请注意,这假设您正在使用令牌身份验证或某种其他形式的身份验证来标识发出请求的用户。如果不是,您将需要相应地修改此代码以以其他方式识别用户。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.