Модель Django Перенос базы данных с помощью ListFields (djangotoolbox)

#django #python-2.7 #django-models #django-south #listfield

#django #python-2.7 #django-модели #django-юг #listfield

Вопрос:

Я уже искал, но не нашел решения своей проблемы… Спасибо за вашу помощь! Я хотел бы перенести свои модели в свою базу данных, но при миграции возникают ошибки.

У меня не было никаких ошибок до использования ListField из djangotoolbox в моих моделях и базе данных mysql. Я предположил, что должен был определить их как djangotoolbox.fields.ListField, но, похоже, он его не распознает. Что я делаю не так? Заранее благодарю вас!

Данные, которые у меня есть, представляют собой списки из 2-х подключений. Например: 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:UsersBlablablaworkspaceageBioDjangomanage.py", line 10, in <module>
execute_from_command_line(sys.argv)
 File "C:Python27libsite-packagesdjangocoremanagement__init__.py", line 399, in execute_from_command_line
utility.execute()
 File "C:Python27libsite-packagesdjangocoremanagement__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
 File "C:Python27libsite-packagesdjangocoremanagementbase.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
 File "C:Python27libsite-packagesdjangocoremanagementbase.py", line 285, in execute
output = self.handle(*args, **options)
 File "C:Python27libsite-packagessouthmanagementcommandsmigrate.py", line 111, in handle
ignore_ghosts = ignore_ghosts,
 File "C:Python27libsite-packagessouthmigration__init__.py", line 220, in migrate_app
success = migrator.migrate_many(target, workplan, database)
 File "C:Python27libsite-packagessouthmigrationmigrators.py", line 254, in migrate_many
result = migrator.__class__.migrate_many(migrator, target, migrations, database)
 File "C:Python27libsite-packagessouthmigrationmigrators.py", line 329, in migrate_many
result = self.migrate(migration, database)
 File "C:Python27libsite-packagessouthmigrationmigrators.py", line 133, in migrate
result = self.run(migration, database)
 File "C:Python27libsite-packagessouthmigrationmigrators.py", line 106, in run
south.db.db.current_orm = self.orm(migration)
 File "C:Python27libsite-packagessouthmigrationmigrators.py", line 279, in orm
return migration.orm()
  File "C:Python27libsite-packagessouthutils__init__.py", line 62, in method
value = function(self)
  File "C:Python27libsite-packagessouthmigrationbase.py", line 432, in orm
return FakeORM(self.migration_class(), self.app_label())
  File "C:Python27libsite-packagessouthorm.py", line 48, in FakeORM
_orm_cache[args] = _FakeORM(*args)  
  File "C:Python27libsite-packagessouthorm.py", line 127, in __init__
self.models[name] = self.make_model(app_label, model_name, data)
  File "C:Python27libsite-packagessouthorm.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:UsersBlablaworkspaceageBioDjangomanage.py migrate" execution.
  

Ответ №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

Похоже, что Юг ожидает либо одного (только класса), либо всех трех (класс список аргументов список kwargs)

Итак, вам нужно сделать:

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

Комментарии:

1. Большое спасибо. Это была ошибка… Однако я столкнулся с другими проблемами, и я думаю, что мне придется jsonify мои данные, потому что Django не может отправить несколько данных в MySQL. Действительно, при сохранении моего объекта, содержащего список, django отправляет уникальные данные в MySQL. MySQL имеет одно значение вместо списка и выдает мне ошибку. (Или я так думаю …) Я очень удивлен, что простой список с плавающей точкой так сложно сохранить с помощью Django…