我正在为教育公司创建一个django应用程序,我创建了一个自定义用户模型和两个类(学生和教师),它们将通过一对一的关系从User模型继承。
我试图避免教师和学生都使用相同的用户对象的情况。因此,我的User对象中有一个user_type char字段,其想法是当用户设置为教师时,该字段将被更新。然后,如果我尝试让用户成为学生,则应该抛出错误。
我试图在clean函数中进行检查 - 在save()函数中调用clean()函数之后,user_type似乎已更新,但是当我实际测试时,似乎user_type是返回一个空白字符串。我想知道是否有人能指出我正确的方向。
class User(AbstractUser):
user_type = models.CharField(max_length=20, choices=USER_TYPES, blank=True)
class Teacher(TimeStampedModel):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
def clean(self):
if self.user.user_type and self.user.user_type !='teacher':
raise ValidationError('Some error')
else:
self.user.user_type = 'teacher'
def save(self, *args, **kwargs):
self.clean()
#this prints 'teacher'
print(self.user.user_type)
super().save(*args, **kwargs)
tests.py
#this test fails
def test_should_set_user_type_automatically_to_teacher(self):
user = User.objects.create(username='tangbj', first_name='Dan')
Teacher.objects.create(user=user)
teacher = Teacher.objects.get(user__username='tangbj')
print(teacher.user.user_type)
self.assertEqual(teacher.user.user_type, 'teacher')
答案 0 :(得分:2)
您正在保存Teacher
实例,不 User
实例。分配user_type
时,您应该save(..)
个User
实例。记录不会神奇地更新。
以另一种方式说;您正在修改实例属性,但您没有保存实例。