Изменение метода модели Django требует миграции?

Требуется ли для изменения метода экземпляра модели в приложении в Django 1.5 миграция через South?

Насколько я понимаю, вы не можете сериализовать случайный код Python... Более того, я понимаю, что миграции действительно предназначены для управления изменениями в схеме таблицы - например, добавление атрибута или поля для записей в таблице... или для управления изменениями к типу самих данных (например, преобразование незашифрованных паролей в хешированные/соленые пароли).

Итак, ЕСЛИ нет никаких изменений, внесенных непосредственно в атрибуты модели, и/или нет изменений в конкретном типе поля или что-то еще, ТО Миграция НЕ нужна, верно?

И вообще можно ли предположить, что изменения методов экземпляра и/или даже статических методов в модели Django НЕ требуют миграции?

(В настоящее время я думаю, что это не так. Дважды проверьте мои мысли здесь через Stackoverlow.)

Что насчет изменений в менеджере моделей? То есть: к методу, который влияет на создание экземпляра объекта?

В частности... что касается первой части моего вопроса об изменении "метода экземпляра"... в этом случае модель подклассифицирует другую пользовательскую модель, и я хочу изменить некоторый код в модели подкласса, например:


class Enrollment(ApiModel):

    # init method, etc., in here

    def pretty_semester(self):
        try:
            sem = self.enrollment_dict.get('CourseSemester', 'No Semester')
            if not sem:

                (...) 

                if results:

                    (...)

                elif 'MTS' in sem:
                    results = re.findall(compiled_mts_match, sem)
                    if results:
                        base_string = "Other B 20"
                        if len(results[0]) == 2:
                            if results[0][1] == '02':
                                base_string = 'Winter B 20'
                            elif results[0][1] == '04':
                                base_string = 'Spring B 20'
                            elif results[0][1] == '07':
                                base_string = 'Summer B 20'
                            elif results[0][1] == '08':
                                base_string = 'Summer B 20'
                            elif results[0][1] == '10':
                                base_string = 'Fall B 20'
                        return '%s%s' % (base_string, results[0][0])

                    (...)

            return sem
        except:
            return sem

Если я изменю только один оператор elif в методе «симпатичный семестр» в приведенном выше классе, вот так...


    def pretty_semester(self):
        try:
            sem = self.enrollment_dict.get('CourseSemester', 'No Semester')
            if not sem:

                (...) 

                if results:

                    (...)

                #super minor alteration of this elif statement...
                elif 'MTS' in sem:
                    results = re.findall(compiled_mts_match, sem)
                    if results:
                        base_string = "Other B 20"
                        if len(results[0]) == 2:
                            if results[0][1] == '02':
                                base_string = 'Winter B 20'
                            elif results[0][1] == '03':       # new line
                                base_string = 'Spring B 20'   # new line
                            elif results[0][1] == '04':
                                base_string = 'Spring B 20'
                            elif results[0][1] == '07':
                                base_string = 'Summer B 20'
                            elif results[0][1] == '08':
                                base_string = 'Summer B 20'
                            elif results[0][1] == '10':
                                base_string = 'Fall B 20'
                        return '%s%s' % (base_string, results[0][0])

                    (...)

            return sem
        except:
            return sem

... тогда это даже потребует миграции?

(НЕТ... не будет, верно?)

(Теперь, если бы я настраивал собственный менеджер моделей... тогда??)

По сути, в дополнение к пониманию приведенного выше примера, я ищу некоторые четкие и простые эмпирические правила для - при взломе модели - требуется миграция... если какие-либо такие советы можно обобщить. Я также знаю, что в Django 1.7 произошли значительные изменения в том, как обрабатываются миграции, но в данном случае я использую версию 1.5.


person Sean    schedule 13.05.2014    source источник


Ответы (2)


«Четкое и простое правило» здесь заключается в том, что миграция на юг необходима только в том случае, если внесенные вами изменения повлияют на схему базы данных. (Здесь я оставляю в стороне миграцию данных, когда вы явно меняете данные, которые в настоящее время находятся в базе данных. Ответ также отличается для встроенных миграций Django в 1.7+.)

Итак, ваша интуиция верна — ничто из того, что вы описали, не требует миграции.

В качестве примера предположим, что вы добавляете blank=True в поле. blank влияет на то, как Django проверяет формы, это ничего не значит на уровне базы данных. Следовательно, это изменение не потребует миграции.

В отличие от этого, null=True представлен на уровне базы данных и поэтому требует миграции.

Поэтому, чтобы действительно понять, когда необходима миграция, вы должны кое-что знать о том, как работают базы данных. Хорошей новостью является то, что South неплохо справляется с автоматическим определением необходимости миграции. Итак, чтобы проверить свою интуицию, просто выполните автоматическую миграцию и посмотрите, что скажет Юг.

person Kevin Christopher Henry    schedule 13.05.2014

Разбивая это на несколько вопросов:

  1. Требуется ли миграция для изменения экземпляра модели или статического метода: НЕТ
  2. Требуется ли миграция для добавления/изменения диспетчера моделей: НЕТ

Как правило, миграция необходима только тогда, когда вы меняете структуру или целостность таблицы БД. Ничего из этого не происходит с модельными методами или менеджерами.

person davko    schedule 13.05.2014