Não requer campo não nulo (permita strings vazios) em formalchemy
-
12-09-2019 - |
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.
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á.