如何解决如何通过OneToOne关系在与用户模型相关的模型中保存使用Django信号发送的额外数据?
我正在尝试为Teacher模型创建注册功能。 Teacher模型通过OneToOne关系与Django的User模型相关。当我尝试保存序列化程序时,出现此错误-
/ peacher / create-teacher中的IntegrityError
没有NULL约束失败:teacher_teacher.school_id_id
我的老师模型:
from django.contrib.auth.models import User
from django.core.validators import RegexValidator
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from school.models import School
class Teacher(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
contact = models.CharField(max_length=10,validators=[RegexValidator(r'^\d{10}$')])
school_id = models.ForeignKey(School,on_delete=models.CASCADE)
@receiver(post_save,sender=User)
def create_user_teacher(sender,instance,created,**kwargs):
if created:
Teacher.objects.create(user=instance)
@receiver(post_save,sender=User)
def save_user_teacher(sender,**kwargs):
instance.teacher.save()
TeacherCreateView:
class TeacherCreateView(APIView):
def post(self,request):
serializer = TeacherSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
TeacherSerializer:
from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer,EmailField,CharField
from rest_framework.validators import UniqueValidator
class TeacherSerializer(ModelSerializer):
email = EmailField(required=True,validators=[UniqueValidator(queryset=User.objects.all())])
password = CharField(min_length=8,write_only=True)
def create(self,validated_data):
user = User.objects.create(
email=validated_data['email'],username=validated_data['username'],first_name=validated_data['first_name']
)
user.set_password(validated_data['password'])
user.teacher.contact = validated_data['contact']
user.teacher.school_id = validated_data['school_id']
user.save()
return user
class Meta:
model = User
fields = ['email','username','password','first_name']
用于创建教师的JSON数据:
{
"email":"teacher@gmail.com","username":"teacher","password":"somepassword","first_name": "Teacher","contact":"1234567890","school_id":"school"
}
不同之处在于,电子邮件,名字和用户名已保存在站点管理员中,但未保存密码。而且在“教师”模型中也没有老师。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。