2016-02-02 4 views
2

Я хочу обновить значения столбцов в моей базе данных SQLAlchemy, если атрибут не равен None.Python: обновить значение атрибута, если нет None

Этот метод работает, но это, кажется, не следовать Сухому принципалу

def editObject(object_id, name, picture, metaTitle, 
    metaKeywords, metaDescription): 

    object = session.query(Object).filter_by(id = object_id).one() 

    if name: 
     object.name = name 
    if picture: 
     object.picture = picture 
    if metaTitle: 
     object.metaTitle = metaTitle 
    if metaKeywords: 
     object.metaKeywords = metaKeywords 
    if metaDescription: 
     object.metaDescription = metaDescription 

    session.add(object) 
    session.commit() 

Спасибо

ответ

1

Вы можете использовать именованные аргументы и setattr()

def editObject(object_id, **kwargs): 

    object = session.query(Object).filter_by(id = object_id).one() 

    for attr, value in kwargs.iteritems(): 
     if value: 
      setattr(object, attr, value) 

    session.add(object) 
    session.commit() 
0

Используя ключевые аргументы, setattr , а также перечня:

def editObject(object_id, **kwargs): 

    object = session.query(Object).filter_by(id = object_id).one() 

    [setattr(object, key, value) for key, value in kwargs.items()] 

    session.add(object) 
    session.commit() 

Тогда при вызове функции, например:

object_id = 1 
attributes_to_update = {"name": "smith", "metaKeywords": "handsome_devil"} 
editObject(object_id, **attributes_to_update) 

В этом примере только name и metaKeywords будут обновлены.