Pergunta

Sou bastante iniciante em formalchemy e parece que não entendo algo. Eu tenho um modelo SQLalChemy definido assim:

...
class Device(meta.Base):
    __tablename__ = 'devices'

    id = sa.Column('id_device', sa.types.Integer, primary_key=True)
    serial_number = sa.Column('sn', sa.types.Unicode(length=20), nullable=False)
    mac = sa.Column('mac', sa.types.Unicode(length=12), nullable=False)
    ipv4 = sa.Column('ip', sa.types.Unicode(length=15), nullable=False)
    type_id = sa.Column('type_id', sa.types.Integer,
                        sa.schema.ForeignKey('device_types.id'))
    type = orm.relation(DeviceType, primaryjoin=type_id == DeviceType.id)
...

Então, no meu controlador (Pylons), crio uma forma formal como esta:

c.device = model.meta.Session.query(model.Device).get(device_id)
fs = FieldSet(c.device, data=request.POST or None)
fs.configure(options=[fs.ipv4.label(u'IP').readonly(),
                      fs.type.label(u'Type').with_null_as((u'—', '')),
                      fs.serial_number.label(u'S/N'),
                      fs.mac.label(u'MAC')])

A documentação diz que "por padrão, não são necessárias colunas nulas. Você só pode adicionar necessidades necessárias, não removê-la". validators.required desalance. Há algo como blank=True, null=False em django?

Para ser mais preciso, quero um validador personalizado como um abaixo, para permitir strings vazios com type=None ou todos os valores a serem definidos não nulos e não vazios:

# For use on fs.mac and fs.serial_number.
# I haven't tested this code yet.
def required_when_type_is_set(value, field):
    type_is_set = field.parent.type.value is not None:
    if value is None or (type_is_set and value.strip() = ''):
        raise validators.ValidationError(u'Please enter a value')

Se possível, gostaria de abster-se de atirar em macacos formalchemy.validators.required ou outros Kludges. Eu não quero definir nullable=True Nos campos modelo, porque também não parece ser uma solução adequada.

Qual é a maneira correta de validar a forma nesse caso? Obrigado por quaisquer sugestões com antecedência.

Foi útil?

Solução

Finalmente encontrou uma maneira (Klugde, mas parece que essa é a única maneira da escolha sã) de fazer isso.

  fs.serial_number.validators.remove(formalchemy.validators.required)
  fs.mac.validators.remove(formalchemy.validators.required)

(Em relação ao meu validador) Observe que a FA irá completamente pule toda a validação quando o valor é None, porque, por convenção, não vai passar None para os validadores (exceto para validators.required, que é codificado). Eu arquivei um tíquete de solicitação de aprimoramento tentando resolver isso: http://code.google.com/p/formalchemy/issues/detail?id=117

Outras dicas

Você pode explicar por que nullable=True não seria a solução?

Para mim, parece inútil armazenar cordas vazias no banco de dados e eu não o incentivaria. Se não houver dados, escolha o tipo mais eficiente para o banco de dados.

Pessoalmente, acho que a solução de django em caso de cordas está errada, pois não suporta realmente nulo em charfields. Se você deseja armazenar nulo em um charfield, terá que fazê -lo manualmente no código.

Esse é exatamente o mesmo problema que estou tendo, onde geralmente escrevo interfaces para bancos de dados existentes e quero usar o FormalChemy, mas acaba tendo que remover manualmente 'necessidade', pois não consigo alterar o banco de dados.

Você pode ensinar formalchemia a não substituir uma entrada vazia por nenhuma alterando o null_as atributo da coluna.

 whatever = Column(Unicode(999), required=False, null_as=("","\0"), nullable=False, default="", doc="Whatever for ever")

FormalChemy substituirá a entrada igual ao segundo membro do null_as tupla com None. (O primeiro é o texto de exibição para seleções e campos semelhantes.)

Se você definir isso como uma string que o usuário não puder inserir, isso nunca acontecerá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top