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()

除了startDateendDate 之外的所有字段都已经存在于数据库中。因此,为了给这些列提供默认值,我通过终端使用 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】:

我必须将djangosouth 版本升级到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 数据库模型

为啥 django-south 不包含在 django.contrib 中? [复制]

使用 Django/South 重命名模型的最简单方法?

PostgreSQL + Django + South 的第一步