改变Django模型的方法需要迁移吗?

时间:2014-05-13 22:46:45

标签: django django-models migration django-south

在Django 1.5中改变app中模型的实例方法是否需要通过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版。

2 个答案:

答案 0 :(得分:3)

"清晰简单的规则"这里只有在您所做的更改会影响数据库架构时才需要南迁移。 (我在此处暂时搁置数据迁移,您将明确更改当前数据库中的数据。对于Django的1.7+内置迁移,答案也不同。)

所以你的直觉是正确的 - 你所描述的任何内容都不需要迁移。

举一个例子,我们假设您将blank=True添加到字段中。 blank影响Django验证表单的方式,它在数据库级别上没有任何意义。因此,该更改不需要迁移。

相比之下,null=True 在数据库级别表示,因此需要迁移。

因此,要真正理解何时需要迁移,您必须了解数据库的工作方式。然而,好消息是,南方非常善于自动检测迁移是否必要。因此,为了测试你的直觉,只需进行自动迁移,看看南方有什么要说的。

答案 1 :(得分:2)

将此问题分解为多个问题:

  1. 更改模型的实例或静态方法是否需要迁移:
  2. 添加/更改模型管理器是否需要迁移:
  3. 作为一般规则,只有在更改数据库表的结构或完整性时才需要迁移。模型方法或管理者都不会发生这种情况。