改变Django模型';s方法需要迁移吗?

改变Django模型';s方法需要迁移吗?,django,django-models,migration,django-south,Django,Django Models,Migration,Django South,在Django 1.5中更改应用程序中模型的实例方法是否需要通过South迁移 我的理解是,您不能序列化随机Python代码。。。此外,我理解迁移实际上是为了管理对表模式的更改——比如为表中的记录添加属性或字段……或者管理对数据类型本身的更改(比如将明文密码升级为散列/盐析密码) 所以——如果没有直接更改模型的属性,和/或没有更改特定的字段类型或其他任何内容——那么迁移就没有必要了,对吗 一般来说,假设对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 班级注册(ApiModel): #init方法等,在这里 def pretty_学期(自我): 尝试: sem=自我注册\直接获取('CourseSemester','No Serm') 如果不是sem: (...) 如果结果是: (...) sem中的elif“MTS”: 结果=re.findall(编译匹配,sem) 如果结果是: base_string=“其他B 20” 如果len(结果[0])==2: 如果结果[0][1]=“02”: 基本字符串='Winter B 20' elif结果[0][1]=“04”: 基本字符串='SpringB20' elif结果[0][1]=“07”: base_字符串='Summer b20' elif结果[0][1]=“08”: base_字符串='Summer b20' elif结果[0][1]=“10”: 基本字符串='Fall B 20' 返回“%s%s%”(基本字符串,结果[0][0]) (...) 返回扫描电镜 除: 返回扫描电镜 如果我在上面的课中只修改了一个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 def pretty_学期(自我): 尝试: sem=自我注册\直接获取('CourseSemester','No Serm') 如果不是sem: (...) 如果结果是: (...) #此elif声明的超轻微更改。。。 sem中的elif“MTS”: 结果=re.findall(编译匹配,sem) 如果结果是: base_string=“其他B 20” 如果len(结果[0])==2: 如果结果[0][1]=“02”: 基本字符串='Winter B 20' elif结果[0][1]=“03”:#新行 base_字符串='Spring B 20'#新行 elif结果[0][1]=“04”: 基本字符串='SpringB20' elif结果[0][1]=“07”: base_字符串='Summer b20' elif结果[0][1]=“08”: base_字符串='Summer b20' elif结果[0][1]=“10”: 基本字符串='Fall B 20' 返回“%s%s%”(基本字符串,结果[0][0]) (...) 返回扫描电镜 除: 返回扫描电镜 …那么这甚至需要迁移吗

(不……不会的,对吗?)

(现在,如果我正在调整自定义模型管理器…那么??)

基本上,除了对上述示例的深入了解之外,我正在寻找一些明确而简单的经验法则——当对模型进行黑客攻击时——需要迁移……如果有任何这样的技巧可以推广的话。我也知道,Django 1.7中迁移的处理方式有了一些重大变化,但是——在本例中——我使用的是1.5版。

这里的“明确而简单的规则”是,只有当所做的更改会影响数据库模式时,才需要南迁移。(在这里我将数据迁移放在一边,在这里您将显式地更改数据库中当前的数据。对于Django在1.7+中的内置迁移,答案也不同。)

所以你上面的直觉是正确的,你所描述的一切都不需要迁移

举个例子,假设您向字段添加
blank=True
blank
影响Django验证表单的方式,它在数据库级别没有任何意义。因此,这种变化不需要迁移

相反,
null=True
在数据库级别表示,因此需要迁移


因此,要真正理解何时需要迁移,您必须了解数据库的工作方式。不过,好消息是,南方非常擅长自动检测迁移是否必要。所以,为了测试你的直觉,只需进行一次自动迁移,看看南方会说些什么。

将其分解为多个问题:

  • 更改模型的实例或静态方法是否需要迁移:NO
  • 添加/更改模型管理器是否需要迁移:NO
  • 一般来说,只有在更改DB表的结构或完整性时才需要迁移。没有