Python 影响在多个角色模型之间迁移到一个模型整型字段

Python 影响在多个角色模型之间迁移到一个模型整型字段,python,django,django-models,Python,Django,Django Models,以前我使用三个模型,分别是User(来自AbstractBaseUser)、Teacher和Student 学生可以创建一个请求,教师可以要求对该请求负责。如果学生接受了,那么老师将成为该请求的负责人 这是请求表的外观: class Request(models.Model): request_id = models.CharField(db_column='requestId', primary_key=True, max_length=36) date_created = m

以前我使用三个模型,分别是User(来自AbstractBaseUser)、Teacher和Student

学生可以创建一个请求,教师可以要求对该请求负责。如果学生接受了,那么老师将成为该请求的负责人

这是请求表的外观:

class Request(models.Model):
    request_id = models.CharField(db_column='requestId', primary_key=True, max_length=36)
    date_created = models.DateField(db_column='dateCreated')
    title = models.CharField(max_length=30)
    request_description = models.CharField(db_column='requestDescription', max_length=280, blank=True, null=True)
    expiration_date = models.DateField(db_column='expirationDate', blank=True, null=True)
    done = models.IntegerField(blank=True, null=True)
    student_id = models.ForeignKey(Student, models.DO_NOTHING, db_column='studentId')
    teacher_id = models.ForeignKey(Teacher, models.DO_NOTHING, db_column='teacherId', blank=True, null=True)
如您所见,学生和教师模型分别有带ForeignKey的student\u id和teacher\u id

现在,我只使用一个模型来表示用户、教师和学生,称为MyUser。在这个模型中,得到了一个字段

user_type = models.IntegerField(db_column='userType')
其中0是具有更多权限的MyUser,255是未指定的MyUser


请求中的FKs现在会发生什么情况?另外,如何通过该字段处理教师和学生?

您必须按照以下多个步骤迁移您的
请求
模型:

  • 为学生和教师添加新的可为空的用户字段,而不删除旧字段:
  • 创建一个数据迁移文件,根据旧字段填充这些新字段:
  • 更新您的代码,以便所有对旧字段的引用都使用新字段,确保您在应用程序级别进行了验证,只允许为每个字段分配正确类型的
    MyUser
  • 使
    Request.student
    字段不可为空
  • 一旦确定数据已正确迁移,就可以删除旧字段。(此步骤是非常可选的,通常可以无限期延迟,直到100%确定所有数据都已正确迁移)

  • 将是什么,
    MyUser.USER\u-TYPE\u-STUDENT
    MyUser.USER\u-TYPE\u-TEACHER
    ?您可以将它们替换为确定用户是学生还是教师的
    USER\u-TYPE
    的任何值
    class Request(models.Model):
        student_id = models.ForeignKey(Student, models.DO_NOTHING, db_column='studentId')
        teacher_id = models.ForeignKey(Teacher, models.DO_NOTHING, db_column='teacherId', blank=True, null=True)
    
        # new fields
        student = models.ForeignKey(MyUser, null=True, related_name='requests', limit_choices_to={'user_type': MyUser.USER_TYPE_STUDENT}, ...)
        teacher = models.ForeignKey(MyUser, null=True, related_name='student_requests', limit_choices_to={'user_type': MyUser.USER_TYPE_TEACHER}, ...)