Como dinâmico campo add personalizado para modelar

votos
1

Como adicionar campo personalizado dynamicly? Eu estou tentando isso, mas o campo não irá inserir no banco de dados quando eu sincronizar 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)
Publicado 28/03/2009 em 09:22
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Você provavelmente não pode fazer isso sem invadir internos do Django. O syncdbcomando inspeciona o objeto meta para cada modelo para obter uma lista de campos para criar, que é criado em tempo de construção classe através da metaclasse da django.db.models.Modelclasse base:

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

Após a construção de classe é completa, por exemplo, após a DEDENT após a classdeclaração, o objeto meta é fixo (não afetado pela modificação da classe de modelo) e você vai ter que cortar o meta (que é naturalmente possível), a fim de adicionar campos dinâmicos . Mas desde que você está mexendo com objetos internos aqui, ele poderia tornar seu aplicativo compatível com futuras versões do Django.

A questão restante é: Por que você iria querer fazer isso? Desde tabelas de banco de dados são normalmente só criado uma vez ao implantar seu aplicativo, os modelos são uma espécie de "estático".

Respondeu 28/03/2009 em 16:58
fonte usuário

votos
0

Eu estava olhando para a mesma coisa e teve de se contentar com SQL cru. Embora você pode usar algo como SQLAlchemy.

Respondeu 19/06/2009 em 10:54
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more