No Django, como posso executar uma função de limpeza personalizada nos dados do fixture durante a importação e validação?

StackOverflow https://stackoverflow.com//questions/11677667

Pergunta

Em um ModelForm eu posso escrever um clean_<field_name> função de membro para validar e limpar automaticamente os dados inseridos por um usuário, mas o que posso fazer com arquivos json ou csv sujos (acessórios) durante um manage.py loaddata?

Foi útil?

Solução

Luminárias carregadas com loaddata são considerados como contendo dados limpos que não precisam de validação (geralmente como uma operação inversa a uma operação anterior dumpdata), então a resposta curta é que loaddata não é a abordagem que você deseja se precisar limpar suas entradas.

No entanto, você provavelmente pode usar alguns dos fundamentos do loaddata ao implementar seu código de limpeza de dados personalizado - tenho certeza que você pode facilmente criar scripts de algo usando o Django bibliotecas de serialização para ler seus arquivos de dados existentes e salvar os objetos resultantes normalmente após a limpeza dos dados.

Outras dicas

Caso outros queiram fazer algo semelhante, defini um método model para fazer a limpeza (para que possa ser chamado a partir de ModelForms)

MAX_ZIPCODE_DIGITS = 9
MIN_ZIPCODE_DIGITS = 5

def clean_zip_code(self, s=None):
    #s = str(s or self.zip_code)
    if not s: return None
    s = re.sub("\D","",s)
    if len(s)>self.MAX_ZIPCODE_DIGITS: 
        s = s[:self.MAX_ZIPCODE_DIGITS]
    if len(s) in (self.MIN_ZIPCODE_DIGITS-1,self.MAX_ZIPCODE_DIGITS-1):
        s = '0'+s # FIXME: deal with other intermediate lengths
    if len(s)>=self.MAX_ZIPCODE_DIGITS:
        s = s[:self.MIN_ZIPCODE_DIGITS]+'-'+s[self.MIN_ZIPCODE_DIGITS:] 
    return s

Em seguida, escrevi um script python independente para limpar meus arquivos json legados usando qualquer clean_ métodos encontrados entre os modelos.

import os, json

def clean_json(app = 'XYZapp', model='Entity', fields='zip_code', cleaner_prefix='clean_'):
    # Set the DJANGO_SETTINGS_MODULE environment variable.
    os.environ['DJANGO_SETTINGS_MODULE'] = app+".settings"
    settings = __import__(app+'.settings').settings
    models   = __import__(app+'.models').models

    fpath    = os.path.join( settings.SITE_PROJECT_PATH, 'fixtures', model+'.json')
    if isinstance(fields,(str,unicode)):
        fields = [fields]
    Ns = []
    for field in fields:
        try:
            instance = getattr(models,model)()
        except AttributeError:
            print 'No model named %s could be found'%(model,)
            continue
        try:
            cleaner = getattr(instance, cleaner_prefix+field)
        except AttributeError:
            print 'No cleaner method named %s.%s could be found'%(model,cleaner_prefix+field)
            continue
        print 'Cleaning %s using %s.%s...'%(fpath,model,cleaner.__name__)
        fin = open(fpath,'r')
        if fin:
            l = json.load(fin)
            before = len(l)
            cleans = 0
            for i in range(len(l)):
                if 'fields' in l[i] and field in l[i]['fields']:
                    l[i]['fields'][field]=cleaner(l[i]['fields'][field]) # cleaner returns None to delete records
                    cleans += 1
            fin.close()
            after = len(l)
            assert after>.5*before
            Ns += [(before, after,cleans)]
            print 'Writing %d/%d (new/old) records after %d cleanups...'%Ns[-1]
            with open(fpath,'w') as fout:
                fout.write(json.dumps(l,indent=2,sort_keys=True))
    return Ns

if __name__ == '__main__':
    clean_json()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top