在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版。
答案 0 :(得分:3)
"清晰简单的规则"这里只有在您所做的更改会影响数据库架构时才需要南迁移。 (我在此处暂时搁置数据迁移,您将明确更改当前数据库中的数据。对于Django的1.7+内置迁移,答案也不同。)
所以你的直觉是正确的 - 你所描述的任何内容都不需要迁移。
举一个例子,我们假设您将blank=True
添加到字段中。 blank
影响Django验证表单的方式,它在数据库级别上没有任何意义。因此,该更改不需要迁移。
相比之下,null=True
在数据库级别表示,因此需要迁移。
因此,要真正理解何时需要迁移,您必须了解数据库的工作方式。然而,好消息是,南方非常善于自动检测迁移是否必要。因此,为了测试你的直觉,只需进行自动迁移,看看南方有什么要说的。
答案 1 :(得分:2)
将此问题分解为多个问题:
作为一般规则,只有在更改数据库表的结构或完整性时才需要迁移。模型方法或管理者都不会发生这种情况。