South ValueError: Невозможно успешно создать поле для модели: у объекта 'module' нет атрибута <CustomClassAttributeHere> - PullRequest
3 голосов
/ 25 февраля 2012

У меня есть модель (/core/models/milestone.py), в которой в качестве атрибута используется пользовательский класс:

from core.models.IntegerRangeField import IntegerRangeField

    class milestone(models.Model):
        name = models.CharField(max_length=128, null=False, blank=False)
        completion = IntegerRangeField(min_value=0,max_value=100, null=False, default=0, blank=True)
        due_date = models.DateField(null=False, blank=False)
        phase = models.ForeignKey('project_phase',null=False, blank=False)
        last_updated_date = models.DateTimeField(null=False, blank=True, default=datetime.now())

        def __unicode__(self):
            return self.name

(на самом деле больше кода - полная копия здесь )

Пользовательский класс, который он использует:

from django.db import models

class IntegerRangeField(models.IntegerField):
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        models.IntegerField.__init__(self, verbose_name, name, **kwargs)
    def formfield(self, **kwargs):
        defaults = {'min_value': self.min_value, 'max_value':self.max_value}
        defaults.update(kwargs)
        return super(IntegerRangeField, self).formfield(**defaults)

    class Meta:
        app_label = 'core'

from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^core\.models\.IntegerRangeField\.IntegerRangeField"])

С этим макетом я могу запустить консоль django, импортировать веху и играть с ней.

Однако, когда я запускаю manage.py schemamigration core --auto, я получаю следующую ошибку:

ValueError: Невозможно успешно создать поле «завершение» для модели «этап»: объект «модуль» не имеет атрибута «IntegerRangeField».

и ничего не обновляется.

У меня такое ощущение, что это как-то связано с перекрестным импортом django.db.models, но я не могу понять, как это исправить.

Ответы [ 2 ]

5 голосов
/ 25 февраля 2012

Итак, вот что я понял:

код в порядке, и проблема вызвана небольшим рефакторингом, который я сделал (класс настраиваемого поля изначально находился внутри модуля tools, и я хотел, чтобы он находился внутри всех других моделей и прочего).

Файл миграции имел следующую строку:

('completion', self.gf('core.tools.IntegerRangeField')(default=0, blank=True)),

и я думаю, что это испортило Юг каким-то образом, чтобы продолжать искать core.tools.IntegerRangeField, пока его там не было.

Я положил IntegerRangeField обратно в tools.py, и все получилось. Weird.

0 голосов
/ 19 сентября 2013

В последней миграции для вашего приложения, если вы измените

('completion', self.gf('core.tools.IntegerRangeField')(default=0, blank=True)),

на

('completion', self.gf('newpackage.newmodule.IntegerRangeField')(default=0, blank=True)),

Тогда ваши миграции снова начнут работать

...