Django South: Как создать правила для настраиваемого поля? - PullRequest
3 голосов
/ 02 июля 2010

Я создал настраиваемое поле "Private FileField".Я не могу заставить его работать с django-south.

Мое понимание правил поля South основано на http://south.aeracode.org/docs/tutorial/part4.html#tutorial-part-4 и http://south.aeracode.org/docs/customfields.html

Соответствующие фрагменты:

class FileField(models.CharField):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        if not 'upload_to' in kwargs:
            raise Exception("%s expects one keyword arg 'upload_to'" % (self.__class__))
        self.upload_to = kwargs['upload_to']
        del kwargs['upload_to']
        kwargs['max_length'] = 255
        super(FileField, self).__init__(*args, **kwargs)

и

rules = [
  (
    (FileField,),
    [],
    {
        "upload_to": ["upload_to", {}],
    },
  )
]

from south.modelsinspector import add_introspection_rules
add_introspection_rules(rules, ["^private_filefield\."])

Выполнение схемы manage.py my_app_name --auto завершается ошибкой со следующим сообщением:

Exception: <class 'private_filefield.fields.FileField'> expects one keyword arg 'upload_to'

(это радует, когда вызывается site-packages / south / orm.py ", строка 46, в FakeORM)

Полный код можно найти по адресу: http://bitbucket.org/vanschelven/django_private_filefield/src/tip/private_filefield/fields.py

=== Редактировать:текст ниже добавлен ===

Это релевантный раздел сгенерированного раздела 'models' автоматически сгенерированной миграции:

    'mailfile.mailfile': {
        'Meta': {'object_name': 'MailFile'},
        'creation_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
        'expires_on': ('django.db.models.fields.DateField', [], {'default': 'datetime.date(2010, 7, 16)'}),
        'file': ('private_filefield.fields.FileField', [], {'max_length': '255'}),
        'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
        'secret': ('django.db.models.fields.CharField', [], {'max_length': '40'})
    }

Обратите внимание на отсутствие параметра upload_to в качестве параметра для'файл'.

1 Ответ

1 голос
/ 14 мая 2011

Бах, я пытался написать это в комментарии, но отсутствие абзацев ненавидит меня.

Я просто настроил ваше настраиваемое поле как есть в приложении Django и создал фиктивную модель для использованияЭто.Юг работает отлично.Я добавил еще один FileField и смог запустить schemamigration --auto без проблем.Итак, я почти уверен, что вы правильно настроили Юг.

Честно говоря, вы проверили вашу модель , чтобы убедиться, что она имеет параметр upload_to?Это вызывает именно это сообщение об ошибке (и это будет означать, что Юг сделал точно , что вы сказали, что он сделал).

...