Как динамически добавить настраиваемое поле в модель - PullRequest
1 голос
/ 28 марта 2009

Как добавить настраиваемое поле динамически? Я пытаюсь это сделать, но поле не будет вставлено в базу данных при синхронизации db:

#It use as register(MyModel)
def register(model, attr="my_attr"):

    if model in registry:
        raise AlreadyRegistered(
            _('The model %s has already been registered.') % model.__name__)

    registry.append(model)
    setattr(model, attr, MyField())

    MyField().contribute_to_class(model, attr) 

#MyField.contribute_to_class
def contribute_to_class(self, cls, name):
     super(MyField, self).contribute_to_class(cls, name)

     setattr(cls, self.name, self)
     cls.add_to_class('%s_manager' %  name, MyDescriptor())

     signals.post_save.connect(self._save, cls, True)

Ответы [ 2 ]

3 голосов
/ 28 марта 2009

Вы, вероятно, не сможете сделать это, не взломав внутренности Джанго. Команда syncdb проверяет мета-объект для каждой модели, чтобы получить список полей для создания, который создается во время создания класса через метакласс базового класса django.db.models.Model:

class MyModel(models.Model):
    my_filed = models.CharField(...)

# Here, class construction is complete and your class has a _meta member.
# If you want, you can check it out in the interactive shell.
meta = MyModel._meta

После завершения строительства класса, например, после DEDENT после оператора class мета-объект фиксируется (на него не влияет изменение класса модели), и вам придется взламывать мета (что, конечно, возможно), чтобы добавить динамические поля. Но так как вы тут возитесь с внутренними объектами, это может сделать ваше приложение несовместимым с будущими выпусками Django.

Остается вопрос: зачем вам это делать? Поскольку таблицы базы данных обычно создаются только один раз при развертывании приложения, модели выглядят как «статичные».

0 голосов
/ 19 июня 2009

Я искал то же самое и должен был согласиться на сырой SQL. Хотя вы можете использовать что-то вроде SQLAlchemy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...