Carlos
Carlos

Reputation: 472

How to get user instance in Model Serializer in django Rest Framework

I have 2 models CustomUser and Student. In CustomUserSerializer, whenever the user is created i also want to create Student instance inside CustomUserSerializer. How can I get the current user instance?

# models.py
class CustomUser(AbstractUser):
    is_student = models.BooleanField('student status', default=False)
    is_teacher = models.BooleanField('teacher status', default=False)
    email = models.EmailField(_('Email Address'), unique=True, blank=True)

class Student(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, primary_key=True)
# serializers.py
class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CustomUser
        fields = [
            'id', 'email', 'is_teacher', 'is_student',..]

    def create(self, validated_data):
        if validated_data.get('is_student') == True:
             Student.objects.create(user=...?) # what should I put here?

        return super(CustomUserSerializer, self).create(validated_data)

[UPDATED] I have another question it's related to Student model.
If I have models like below should I create serializer for Student? when I want to have serializer for Class.

class Class(models.Model):
    student = models.ManyToManyField(Student)

Thanks

Upvotes: 0

Views: 719

Answers (1)

JPG
JPG

Reputation: 88499

Change your create method as

class CustomUserSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        is_student = validated_data.pop("is_student", False)
        user = super().create(validated_data)
        if is_student:
            Student.objects.create(user=user)
        return user

    class Meta:
        model = models.CustomUser
        fields = [
            'id', 'email', 'is_teacher', 'is_student',..
        ]

Upvotes: 1

Related Questions