python - 如何在 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')
任何帮助或关于同时保存两个用户(即教师用户和用户)的任何建议从订购的字典中弹出教师用户将有很大帮助。
解决方案
我是编写的代码片段,您可以从中参考
序列化器:-
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,)
推荐阅读
- dataframe - 如何在数据框中生成 n 列而不为所有列重复 random.randint 公式,如下所示?
- python - 组合函数的两个参数
- java - 为什么 ObjectMapperr 不将值写入文件?
- python - Spyder 无法识别任何已安装的软件包,因此不会加载它们
- json - 如何将两个不同的对象(JSON)(父类和子类)传递给 Postman 中的 POST 请求以测试 API?
- duplicates - 复制文本文件中的每一行
- java - REST api 只有 1 个对象 java
- matplotlib - 如何在 Matplotlib 中使用 set_xticks 的面向对象版本?
- python - 使用加密的 SECRET_KEY 作为环境变量的 GitHub Actions 不起作用
- angular - 用户在 Firebase 中注销期间发生错误