首页 > 解决方案 > Create OneToOne field user object in Django serialization

问题描述

I am trying to create the User object using my Staff class. My staff model looks like following,

class Staff(models.Model):
    organization = models.ForeignKey(
        Organization, related_name='staff_organization', on_delete=models.CASCADE, blank=True)
    user = models.OneToOneField(
        User, on_delete=models.CASCADE, blank=True)
    phone = models.CharField(max_length=15, blank=True)

    def __str__(self):
        return self.user.username

My serializer class is here,

# create staff serializer
class StaffSerializer(serializers.ModelSerializer):

    class Meta:
        model = Staff
        fields = "__all__"

    def create(self, validated_data):
        username = validated_data.pop('username')
        email = validated_data.pop('email')
        password = validated_data.pop('password')
        user_instance, created = User.objects.get_or_create(
            username=username, email=email)

        if not created:
            user_instance.set_password(password)

        staff_instance = Staff.objects.create(
            **validate_data, user=user_instance)
        return staff_instance

Viewset class,

class StaffViewSet(viewsets.ModelViewSet):
    serializer_class = StaffSerializer
    queryset = Staff.objects.all()
    permission_classes = [permissions.IsAuthenticated]


    def perform_create(self, serializer):
        staff = serializer.save(organization=self.request.user.staff.organization)
        return Response(serializer.data)

I tried the post request as below,

{"username":"tekson", "email":"tekson@gmail.com", "password":"admin"}

But it shows the error

{
    "user": [
        "This field is required."
    ]
}

I don't know how to create the user object from the staff. Please help me to figure out this error.

标签: pythondjangodjango-rest-framework

解决方案


Make sure to call user_instance.save() after set_password().


推荐阅读