Django South:如何为自定义字段创建规则?

时间:2010-07-02 12:40:05

标签: django django-south

我创建了一个自定义字段“Private FileField”。我无法让它与django-south合作。

我对南方野战规则的理解是基于 http://south.aeracode.org/docs/tutorial/part4.html#tutorial-part-4http://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 schemamigration my_app_name --auto失败,并显示以下消息:

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

(当调用FakeORM中的site-packages / south / orm.py“,第46行时发生这种情况)

完整代码可在以下位置找到: http://bitbucket.org/vanschelven/django_private_filefield/src/tip/private_filefield/fields.py

===编辑:下面添加的文字===

这是自动生成的迁移的生成“模型”部分的相关部分:

    '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'作为'file'的参数。

1 个答案:

答案 0 :(得分:1)

Bah,我试着在评论中写这个,但缺少段落讨厌我。

我只是在Django应用程序中按原样设置自定义字段,并创建了一个虚拟模型来使用它。南方运作完美。我添加了另一个FileField,并且能够毫无问题地运行schemamigration --auto。所以,我很确定你已经正确设置了South。

老实说,您是否检查了模型以确保它具有upload_to参数?这恰好导致了这个错误信息(这意味着南方确实正好你告诉它做什么)。