如何与Django用户模型建立一对一关系的自定义模型的Rest Api

时间:2019-06-17 13:13:21

标签: python django django-models django-rest-framework

我想构建一个REST API端点,以便在与从abstractuser继承的Users模型具有一对一关系的模型上进行创建操作。

这是用户模型

class Users(AbstractUser):
    is_user = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)

这是我的管理员模型

class Admin(models.Model):
    user = models.OneToOneField(Users, on_delete=models.CASCADE, primary_key=True, related_name='admin')
    organization = models.CharField(max_length=255, blank=True)

    def __str__(self):
        return self.organization

这是我的序列化器

class UsersSerializers(serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = ('id', 'username', 'password')
        write_only_fields = ('password',)

这是我的创建api视图

class UserCreateView(generics.ListCreateAPIView):
    """
    This class defines the create behavior of our rest api.

    get:
    Return a list of all the existing users.

    post:
    Create a new user instance.
    """
    queryset = Users.objects.all()
    serializer_class = UsersSerializers

    def perform_create(self, serializer):
        """Save the post data when creating a new Book."""
        # serializer.save()
        instance = serializer.save()
        instance.set_password(instance.password)
        instance.save()

我还希望能够与用户模型一起序列化管理模型及其字段的实例,我不知道该如何处理,但是我希望能够在用户模型字段旁边显示管理模型字段并与用户模型一起保存管理模型数据。

1 个答案:

答案 0 :(得分:1)

像下面一样在serializer中再增加一个字段

class UsersSerializers(serializers.ModelSerializer):
    organization = serializers.CharField()

    class Meta:
        model = Users
        fields = ('id', 'username', 'password', 'organization')
        write_only_fields = ('password',)

现在,在perform_create方法中,为Admin创建一个对象

    def perform_create(self, serializer):
        """Save the post data when creating a new Book."""
        # serializer.save()
        instance = serializer.save()
        instance.set_password(instance.password)
        instance.save()
        organization = serializer.validated_data.get('organization')
        Admin.objects.create(
           user=instance,
           organization=organization
        )