django не принимает во внимание поля модели, объявленные в __init__ - PullRequest
0 голосов
/ 08 сентября 2010

При использовании класса Model следующим образом:

class MyModel(models.Model):
    def __init__(self, *args, **kwargs):
        self.myfield = models.Field()
        super(MyModel, self).__init__(*args, **kwargs)

Это не учитывает myfield (в форме администратора при сохранении объекта ...)

Но если язаявить так:

class MyModel(models.Model):
    myfield = models.Field()

Работает просто отлично.

Почему?

Редактировать

Я думаю, у меня естьвеская причина: у меня есть абстрактный класс UploadItem, который определяет поле с именем file следующим образом: self.file = models.FileField(upload_to=upload_to) Как вы можете видеть, в каждом дочернем классе я должен вызывать родительский метод init с соответствующей переменной upload_to (например, «videos» для модели Video).).Так что я не могу сделать это обычным способом.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Потому что код Django ORM делает некоторую серьезную метамагию во время определения класса (просто просмотрите код django / db, чтобы увидеть, как волшебство). Вы выполняете эту магию в конце, создавая поля на лету в функции __init __ ().

Есть ли действительно хорошая причина не создавать класс обычным способом? Если нет, то делай это обычным способом. Если у вас действительно есть веская причина, тогда будьте готовы войти в глубокий конец пула действительно - как Python, так и Django.

1 голос
/ 08 сентября 2010

Установка динамического пути для атрибута upload_to абсолютно не является хорошей причиной для того, чтобы возиться с объявлением поля модели.

Это то, что Django уже обрабатывает - если вы установите upload_to для вызова, вы можете вернуть правильное значение в зависимости от экземпляра модели. См. документацию .

...