2015-09-10 3 views
3

У меня проблема с более эффективным поиском, я сделал код по-разному и не убедил меня. Я пытаюсь найти сотрудника с тремя фильтрами, именем, фамилией и отделом, где он работает.Python, SqlAlchemy. Как сделать более эффективный поиск?

код в представлении выглядит следующим образом:

if form.nombre.data == u'' and form.apellido.data == u'' and form.departamento.data != u'': 
    empleados = db.session.query(Empleado).filter_by(departamento_id=form.departamento.data).all() 

elif form.nombre.data == u'' and form.apellido.data != u'' and form.departamento.data == u'': 
    empleados = db.session.query(Empleado).filter_by(apellido=form.apellido.data.lower()).all() 

elif form.nombre.data == u'' and form.apellido.data != u'' and form.departamento.data != u'': 
    empleados = db.session.query(Empleado).filter_by(apellido=form.apellido.data.lower(), 
                 departamento_id=form.departamento.data).all() 

elif form.nombre.data != u'' and form.apellido.data == u'' and form.departamento.data == u'': 
    empleados = db.session.query(Empleado).filter_by(nombre=form.nombre.data.lower()).all() 

elif form.nombre.data != u'' and form.apellido.data == u'' and form.departamento.data != u'': 
    empleados = db.session.query(Empleado).filter_by(nombre=form.nombre.data.lower(), 
                 departamento_id=form.departamento.data).all() 

elif form.nombre.data != u'' and form.apellido.data != u'' and form.departamento.data == u'': 
    empleados = db.session.query(Empleado).filter_by(nombre=form.nombre.data.lower(), apellido=form.apellido.data.lower()).all() 

elif form.nombre.data != u'' and form.apellido.data != u'' and form.departamento.data != u'': 
    empleados = db.session.query(Empleado).filter_by(nombre= form.nombre.data.lower(), apellido=form.apellido.data.lower(), departamento_id=form.departamento.data).all() 

else: 
    empleados = db.session.query(Empleado).all() 

Как вы можете видеть, что это ужасный код. если бы вы добавили фильтр, это было бы комбинацией из 16 операторов, если не говоря уже о двух других.

Любой тип ответа приветствуется. Спасибо

ответ

1

Просто построить запрос, как вы идете, что-то вроде:

query = db.session.query(Empleado) 

if form.nombre.data != '': 
    query = query.filter_by(nombre=form.nombre.data.lower()) 
if form.apellido.data != '': 
    query = query.filter_by(apellido=form.apellido.data.lower()) 
if form.departamento.data != '': 
    query = query.filter_by(departamento_id=form.departamento.data) 

print query.all() 
+0

Благодарим за помощь. : D –

0

Вы можете захотеть использовать or_ или and_ фильтры. Как:

from sqlalchemy import or_ 
filter(or_(User.name == 'ed', User.name == 'wendy')) 

Смотрите также tutorial и этот post.

Смежные вопросы