Django South 错误:AttributeError:'DateTimeField' 对象没有属性'model'`
Posted
技术标签:
【中文标题】Django South 错误:AttributeError:\'DateTimeField\' 对象没有属性\'model\'`【英文标题】:Django South Error: AttributeError: 'DateTimeField' object has no attribute 'model'`Django South 错误:AttributeError:'DateTimeField' 对象没有属性'model'` 【发布时间】:2013-12-25 03:38:20 【问题描述】:所以我试图通过添加两列来迁移一个表。一个startDate
和一个endDate
。对 Django 使用 south
,这应该是一个简单的迁移。我还有很多其他带有 dateTimes 的表,但由于某种原因,我在这里得到并发布,但我没有看到它。
堆栈跟踪说明:
AttributeError: 'DateTimeField' object has no attribute 'model'
这是我要迁移的模型:
# Keep track of who has applied for a Job
class JobApply(models.Model):
job = models.ForeignKey(Jobs)
user = models.ForeignKey(User)
# Keep track of the Developer accepted to do the work
accepted_dev = models.IntegerField(null=False, blank=False, default=0)
# If 1 (True) the User has applied to this job
isApplied = models.BooleanField(default=0)
startDate = models.DateTimeField()
endDate = models.DateTimeField()
除了startDate
和endDate
之外的所有字段都已经存在于数据库中。因此,为了给这些列提供默认值,我通过终端使用 datetime.date.now() 来保持一切正常。问题是 South 的 schemamigration
工作得很好,但实际迁移失败。
如果有人能看到错误,我的头发会很感激。 :P
编辑: 包括 Stacktrace:
Running migrations for insource:
- Migrating forwards to 0004_auto__add_field_jobapply_startDate__add_field_jobapply_endDate.
> insource:0004_auto__add_field_jobapply_startDate__add_field_jobapply_endDate
Error in migration: insource:0004_auto__add_field_jobapply_startDate__add_field_jobapply_endDate
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 285, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/dist-packages/south/management/commands/migrate.py", line 111, in handle
ignore_ghosts = ignore_ghosts,
File "/usr/local/lib/python2.7/dist-packages/south/migration/__init__.py", line 220, in migrate_app
success = migrator.migrate_many(target, workplan, database)
File "/usr/local/lib/python2.7/dist-packages/south/migration/migrators.py", line 229, in migrate_many
result = migrator.__class__.migrate_many(migrator, target, migrations, database)
File "/usr/local/lib/python2.7/dist-packages/south/migration/migrators.py", line 304, in migrate_many
result = self.migrate(migration, database)
File "/usr/local/lib/python2.7/dist-packages/south/migration/migrators.py", line 129, in migrate
result = self.run(migration, database)
File "/usr/local/lib/python2.7/dist-packages/south/migration/migrators.py", line 113, in run
return self.run_migration(migration, database)
File "/usr/local/lib/python2.7/dist-packages/south/migration/migrators.py", line 83, in run_migration
migration_function()
File "/usr/local/lib/python2.7/dist-packages/south/migration/migrators.py", line 59, in <lambda>
return (lambda: direction(orm))
File "/home/jared/Desktop/School/insource/insource/migrations/0004_auto__add_field_jobapply_startDate__add_field_jobapply_endDate.py", line 14, in forwards
keep_default=False)
File "/usr/local/lib/python2.7/dist-packages/south/db/generic.py", line 47, in _cache_clear
return func(self, table, *args, **opts)
File "/usr/local/lib/python2.7/dist-packages/south/db/generic.py", line 411, in add_column
sql = self.column_sql(table_name, name, field)
File "/usr/local/lib/python2.7/dist-packages/south/db/generic.py", line 706, in column_sql
default = field.get_db_prep_save(default, connection=self._get_connection())
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 350, in get_db_prep_save
prepared=False)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 911, in get_db_prep_value
value = self.get_prep_value(value)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 902, in get_prep_value
(self.model.__name__, self.name, value),
AttributeError: 'DateTimeField' object has no attribute 'model'
迁移代码(有点长,添加相关代码):
def forwards(self, orm):
# Adding field 'JobApply.startDate'
db.add_column(u'insource_jobapply', 'startDate',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 12, 7, 0, 0)),
keep_default=False)
# Adding field 'JobApply.endDate'
db.add_column(u'insource_jobapply', 'endDate',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 12, 7, 0, 0)),
keep_default=False)
def backwards(self, orm):
# Deleting field 'JobApply.startDate'
db.delete_column(u'insource_jobapply', 'startDate')
# Deleting field 'JobApply.endDate'
db.delete_column(u'insource_jobapply', 'endDate')
u'insource.jobapply':
'Meta': 'object_name': 'JobApply',
'accepted_dev': ('django.db.models.fields.IntegerField', [], 'default': '0'),
'endDate': ('django.db.models.fields.DateTimeField', [], ),
u'id': ('django.db.models.fields.AutoField', [], 'primary_key': 'True'),
'isApplied': ('django.db.models.fields.BooleanField', [], 'default': 'False'),
'job': ('django.db.models.fields.related.ForeignKey', [], 'to': u"orm['insource.Jobs']"),
'startDate': ('django.db.models.fields.DateTimeField', [], ),
'user': ('django.db.models.fields.related.ForeignKey', [], 'to': u"orm['auth.User']")
,
【问题讨论】:
你能给我们整个堆栈跟踪吗?我在任何地方都没有看到.model
,正如我所期望的AttributeError
...
您也可以分享一个迁移代码吗?我用过几次这样的迁移,它们运行得很顺利......
查看我编辑的问题。
models.DateField
工作得很好。是models.DateTimeField
引发了这个问题。奇怪...
这很奇怪,但升级到south
0.8.4 版可以帮我解决这个问题。
【参考方案1】:
我必须将django
的south
版本升级到0.8.4
版本。
必须运行以下命令:
sudo easy_install -U South
或者,如果使用pip
:
pip install South --upgrade
之后,我的迁移按预期进行。
【讨论】:
为了完整起见:这似乎已在 0.8.3 中修复:code.djangoproject.com/ticket/21312以上是关于Django South 错误:AttributeError:'DateTimeField' 对象没有属性'model'`的主要内容,如果未能解决你的问题,请参考以下文章
什么是 Django South GhostMigrations 异常以及如何调试它?
Django South 向管理员添加了模型,但给出了 DatabaseError
无法在 Django 1.7 中创建 South 数据库模型