首页 > 解决方案 > 如何在 django 中同时保存和创建两个模型用户?

问题描述

我有以下模型用户和教师用户模型是从 AbstractBaseUser 继承的,教师与用户是一对一的关系。下面是教师用户模型。

class TeacherUser(BaseModel):
    user = models.OneToOneField(User, on_delete=models.CASCADE, )
    faculty = models.CharField(max_length=100)
    faculty_code = models.CharField(max_length=100)
    is_full_time = models.BooleanField(default=False)
    joined_date = models.DateField()

    objects = TeacherUserManager()

现在的问题是我希望教师在注册教师用户时只填写一张表格。所以我尝试了这个TeacherSerialzier.

class CreateTeacherUserSerializer(TeacherUserSerializer):
    class Meta(TeacherUserSerializer.Meta):
        fields = (
            'faculty',
            'faculty_code',
            'is_full_time',
            'joined_date'
        )


class CreateUserSerializer(UserSerializer):
    techer = CreateTeacherUserSerializer(source='teacheruser')

    class Meta(UserSerializer.Meta):
        fields = (
            'username',
            'fullname',
            'email',
            'phone_number',
            'password',
            'techer'
        )
        extra_kwargs = {
            'password': {
                'write_only': True,
                'style': {'input_type': 'password'}
            }
        }

给出的默认形式如下(图片)。

用户和教师用户表格

现在在我的views.py上,我尝试创建我的用户和教师用户

class CreateUserView(generics.CreateAPIView):
    serializer_class = serializers.CreateUserSerializer
    permission_classes = (AllowAny,)

    def perform_create(self, serializer):
        return usecases.CreateUserUseCase(serializer=serializer).execute()

我尝试创建用户的主要逻辑部分如下

usecases.py

User = get_user_model()


class CreateUserUseCase:
    def __init__(self, serializer):
        self._serializer = serializer
        self._data = serializer.validated_data

    def execute(self):
        self._factory()

    def _factory(self):
        teacher_user = self._data.get('teacheruser')

默认情况下,当我填写上面的图像表单时,我会得到有序字典,然后会出现另一个teacheruser字典。我可以使用访问teacheruser字典,self._data.get('teacheruser') 但我无法使用self._data.pop('teacheruser') 任何帮助或关于同时保存两个用户(即教师用户和用户)的任何建议从订购的字典中弹出教师用户将有很大帮助。

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


我是编写的代码片段,您可以从中参考

序列化器:-

from django.db import transaction

class CreateUserSerializer(ModelSerializer):
    techer = CreateTeacherUserSerializer(source='teacheruser')

    class Meta(UserSerializer.Meta):
        fields = (
            'username',
            'fullname',
            'email',
            'phone_number',
            'password',
            'techer'
        )
        extra_kwargs = {
            'password': {
                'write_only': True,
                'style': {'input_type': 'password'}
            }
        }
        
    def create(self, validated_data):
        teacher_data = validated_data.pop("techer")
        with transaction.atomic():
            user = super(CreateUserSerializer, self).create(validated_data)
            teacher_data["user"] = user
            TeacherUser.objects.create(**teacher_data)
            return user

看法

class CreateUserView(generics.CreateAPIView):
    serializer_class = serializers.CreateUserSerializer
    permission_classes = (AllowAny,)


推荐阅读