我有一个使用自定义类作为属性的模型(/core/models/milestone.py):
from core.models.IntegerRangeField import IntegerRangeField
class milestone(models.Model):
name = models.CharField(max_length=128, null=False, blank=False)
completion = IntegerRangeField(min_value=0,max_value=100, null=False, default=0, blank=True)
due_date = models.DateField(null=False, blank=False)
phase = models.ForeignKey('project_phase',null=False, blank=False)
last_updated_date = models.DateTimeField(null=False, blank=True, default=datetime.now())
def __unicode__(self):
return self.name
(实际上还有更多代码 - full copy here)
它使用的自定义类是:
from django.db import models
class IntegerRangeField(models.IntegerField):
def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
self.min_value, self.max_value = min_value, max_value
models.IntegerField.__init__(self, verbose_name, name, **kwargs)
def formfield(self, **kwargs):
defaults = {'min_value': self.min_value, 'max_value':self.max_value}
defaults.update(kwargs)
return super(IntegerRangeField, self).formfield(**defaults)
class Meta:
app_label = 'core'
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^core\.models\.IntegerRangeField\.IntegerRangeField"])
通过这种布局,我可以运行django控制台,导入里程碑并使用它。
但是,当我运行manage.py schemamigration core --auto时,我收到以下错误:
ValueError:无法为模型'milestone'成功创建字段'completion':'module'对象没有属性'IntegerRangeField'。
并且没有任何更新。
我觉得它与交叉导入django.db.models有关,但是无法解决如何解决这个问题。
答案 0 :(得分:5)
所以,这就是我的想法:
代码很好,问题是由我做的一些重构引起的(自定义字段类最初位于工具模块中,我希望它可以放在所有其他模型和东西中)。
迁移文件包含此字符串:
('completion', self.gf('core.tools.IntegerRangeField')(default=0, blank=True)),
并且我认为这已经以某种方式搞砸了南方,以便继续寻找core.tools.IntegerRangeField,而它已经不存在了。
我把IntegerRangeField放回到tools.py中,这一切都解决了。怪异。
答案 1 :(得分:0)
在您上次迁移的应用中,如果您更改
('completion', self.gf('core.tools.IntegerRangeField')(default=0, blank=True)),
到
('completion', self.gf('newpackage.newmodule.IntegerRangeField')(default=0, blank=True)),
然后您的迁移将重新开始工作