É possível definir nomes de campos do modelo dinamicamente?

votos
0

Agora eu tenho este código:

class Mymodel(models.Model):
    xxxx_count = ForeignCountField(filter={'foreign_table__xxxx': True})
    yyyy_count = ForeignCountField(filter={'foreign_table__yyyy': True})
    zzzz_count = ForeignCountField(filter={'foreign_table__zzzz': True})
    qqqq_count = ForeignCountField(filter={'foreign_table__qqqq': True})
    ssss_count = ForeignCountField(filter={'foreign_table__ssss': True})
    rrrr_count = ForeignCountField(filter={'foreign_table__rrrr': True})

Eu quero algo parecido com isto:

class Mymodel(models.Model):
    for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']:
        setattr(self, '%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True}))

Mas quando eu tento fazer isso, erro levantada: eu não definido. Preciso colocar esse código em algum outro lugar?

Publicado 28/04/2009 em 10:18
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

Se você quiser adicionar campos definição do modelo fora você tem que usar add_to_classmétodo do modelo:

class Mymodel(models.Model):
    pass

for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']:
    Mymodel.add_to_class('%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True})))
Respondeu 29/04/2009 em 10:48
fonte usuário

votos
1

Eu gostaria de saber um pouco mais sobre as decisões de design que você chegou a esse ponto. O que é um ForeignCountField e por que você precisa dele? Não deveria ser uma propriedade das respectivas tabelas? (Um método do gerente ou um classmethod?)

Respondeu 29/04/2009 em 09:56
fonte usuário

votos
1

A maneira de automatizar a criação de vários atributos de classe é escrevendo uma metaclasse. Seria certamente possível a subclasse metaclass ModelBase do Django e adicionar a funcionalidade que você precisa; mas também seria um exagero e provavelmente menos sustentável do que apenas escrevê-los.

Respondeu 28/04/2009 em 22:19
fonte usuário

votos
-1

Talvez você precisa colocá-lo está o código no método do construtor de inicialização de sua classe.

def __init__(self, *args, **kwargs):
    .....
    super(MyModel, self).__init__(*args, **kwargs)

Edit: Desculpe este não funcionam . Talvez você pode tentar olhar para Este , 'isso funciona com django 0,96. Existem algumas modificações que tornam difícil ajustá-la com o Django versão 1.0' .

Se você wa d sujo e rápido você pode tentar algo como isto:

class Foo(models.Model):
    letters = ["A", "B", "C"]
    for l in letters:
        exec "%s_count = models.CharField(max_length=255)" % l
Respondeu 28/04/2009 em 10:28
fonte usuário

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