【问题标题】:Django Model Migrate a Database with ListFields (djangotoolbox)Django 模型使用 ListFields 迁移数据库 (djangotoolbox)
【发布时间】:2014-08-06 11:41:11
【问题描述】:

我已经搜索过,但没有找到解决问题的方法...感谢您的帮助! 我想将我的模型迁移到我的数据库,但迁移时出现错误。

在我的模型和 mysql 数据库中使用 djangotoolbox 中的 ListField 之前,我没有任何错误。我想我必须将它们定义为 djangotoolbox.fields.ListField 但它似乎无法识别它。我究竟做错了什么? 提前谢谢!

我拥有的数据是 2-uplets 的列表。例如 : listeAGE=[[12.3,0.8],[16.5,0.6],[85.4,2.6],...]

这是我的 django 模型:

from djangotoolbox.fields import ListField
class Abaque(models.Model):
      listeAGE = ListField(models.FloatField(default=0))

这是我要迁移的基地:

from south.db import db
from south.v2 import SchemaMigration
from django.db import models
from djangotoolbox import fields
class Migration(SchemaMigration):

    # Adding model 'Abaque'
    db.create_table(u'ageBio_abaque', (
        (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
        ('listeAGE', self.gf('django.db.models.fields.FloatField')(default=False)),
    ))
    db.send_create_signal(u'ageBio', ['Abaque'])

    def backwards(self, orm):

    models = {
    u'ageBio.abaque': {
        'Meta': {'object_name': 'Abaque'},
        u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'listeAGE': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeIMC': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeRTH': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeTAS': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeCHOL': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeGLY': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeTRIG': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeHEMO': ('djangotoolbox.fields.ListField',{'default': '0'}),
        'listeVGM': ('djangotoolbox.fields.ListField',{'default': '0'}),
     },
     }

然后我创建我的数据库,syncdb,迁移但我有以下错误:

 Traceback (most recent call last):
 File "C:\Users\Blablabla\workspace\ageBioDjango\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
 File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 399, in execute_from_command_line
utility.execute()
 File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
 File "C:\Python27\lib\site-packages\django\core\management\base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
 File "C:\Python27\lib\site-packages\django\core\management\base.py", line 285, in execute
output = self.handle(*args, **options)
 File "C:\Python27\lib\site-packages\south\management\commands\migrate.py", line 111, in handle
ignore_ghosts = ignore_ghosts,
 File "C:\Python27\lib\site-packages\south\migration\__init__.py", line 220, in migrate_app
success = migrator.migrate_many(target, workplan, database)
 File "C:\Python27\lib\site-packages\south\migration\migrators.py", line 254, in migrate_many
result = migrator.__class__.migrate_many(migrator, target, migrations, database)
 File "C:\Python27\lib\site-packages\south\migration\migrators.py", line 329, in migrate_many
result = self.migrate(migration, database)
 File "C:\Python27\lib\site-packages\south\migration\migrators.py", line 133, in migrate
result = self.run(migration, database)
 File "C:\Python27\lib\site-packages\south\migration\migrators.py", line 106, in run
south.db.db.current_orm = self.orm(migration)
 File "C:\Python27\lib\site-packages\south\migration\migrators.py", line 279, in orm
return migration.orm()
  File "C:\Python27\lib\site-packages\south\utils\__init__.py", line 62, in method
value = function(self)
  File "C:\Python27\lib\site-packages\south\migration\base.py", line 432, in orm
return FakeORM(self.migration_class(), self.app_label())
  File "C:\Python27\lib\site-packages\south\orm.py", line 48, in FakeORM
_orm_cache[args] = _FakeORM(*args)  
  File "C:\Python27\lib\site-packages\south\orm.py", line 127, in __init__
self.models[name] = self.make_model(app_label, model_name, data)
  File "C:\Python27\lib\site-packages\south\orm.py", line 320, in make_model
   raise ValueError("Field '%s' on model '%s.%s' has a weird definition length (should be 1 or 3 items)." % (fname, app, name))
ValueError: Field 'listeAGE' on model 'ageBio.Abaque' has a weird definition length (should be 1 or 3 items).
Finished "C:\Users\Blabla\workspace\ageBioDjango\manage.py migrate" execution.

【问题讨论】:

    标签: django python-2.7 django-models django-south listfield


    【解决方案1】:

    我认为问题出在这里:

       u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
       'listeAGE': ('djangotoolbox.fields.ListField',{'default': '0'}),
    

    注意id 字段定义和我猜你手动添加的列表字段之间的区别......你的元组只有两个元素,而id 有三个

    http://south.readthedocs.org/en/latest/customfields.html#south-field-triple

    South 似乎期望一个(只是类)或全部三个(类 + args 列表 + kwargs 字典)

    所以你需要这样做:

       'listeAGE': ('djangotoolbox.fields.ListField', [], {'default': '0'}),
       etc
    

    【讨论】:

    • 非常感谢。这是错误...但是我遇到了其他问题,我想我将不得不对我的数据进行 jsonify 处理,因为 Django 无法将多个数据发送到 mySQL。实际上,当保存包含列表的对象时,django 会向 mySQL 发送唯一数据。 mySQL 有一个值,而不是一个列表,然后给我一个错误。 (或者我认为......)我很惊讶一个简单的浮点列表很难用 Django 存储......
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2014-01-03
    • 2018-03-04
    • 2012-11-18
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多