Django - 重写的保存功能不会保存父字段

时间:2017-07-09 14:38:02

标签: django

我正在为教育公司创建一个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')

1 个答案:

答案 0 :(得分:2)

您正在保存Teacher实例, User实例。分配user_type时,您应该save(..)User实例。记录不会神奇地更新。

以另一种方式说;您正在修改实例属性,但您没有保存实例。