Миграция воздействия между несколькими ролевыми моделями в одну модель IntegerField - PullRequest
0 голосов
/ 16 апреля 2020

В прежние времена я использовал три модели: «Пользователь» (из AbstractBaseUser), «Учитель» и «Ученик».

Ученик мог создать запрос, а учитель мог попросить нести ответственность за этот запрос. Если ученик согласится, то учитель станет ответственным за этот запрос.

Вот как выглядит таблица запроса:

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)

Как вы можете видеть, есть student_id и teacher_id с ForeignKey соответственно, модели ученика и учителя.

Теперь я использую только одну модель для представления пользователя, учителя и ученика, которая называется MyUser. В этой модели получено поле

user_type = models.IntegerField(db_column='userType')

, где 0 - это MyUser с большими разрешениями, а 255 - это неопределенный MyUser.

Что теперь происходит с FK в запросе? Кроме того, как обращаться с Учителем и Студентом через это поле?

1 Ответ

1 голос
/ 16 апреля 2020

Вам нужно будет перенести модель Request в несколько этапов следующим образом:

  1. Добавить новые пустые пользовательские поля для ученика и учителя БЕЗ удаления старых полей:
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}, ...)

Создайте файл переноса данных, который заполняет эти новые поля на основе старых полей: https://docs.djangoproject.com/en/3.0/topics/migrations/#data -migrations Обновите код, чтобы все ссылки на старые поля использовали новые поля убедитесь, что у вас есть проверка на уровне приложения, разрешающая только правильные типы MyUser, назначенные каждому полю Сделать поле Request.student необнуляемым. Как только вы убедитесь, что данные имеют были перенесены правильно, вы можете удалить старые поля. (этот шаг является необязательным и обычно может быть отложен на неопределенный срок, пока вы не будете на 100% уверены, что все данные были перенесены правильно)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...