SQLALchemy dynamic filter_by

前端 未结 2 452
温柔的废话
温柔的废话 2020-12-09 11:51

I know you can build dynamic filters for queries for SQLAlchemy by supplying **kwargs to filter_by.

For example

    filt         


        
相关标签:
2条回答
  • 2020-12-09 12:04

    Instead of using filter_by I would recommend using filter, it gives you a lot more options.

    For example (from the manual):

    db.session.query(MyClass).filter(
        MyClass.name == 'some name',
        MyClass.id > 5,
    )
    

    In relation to your case:

    filters = (
        Transaction.amount > 10,
        Transaction.amount < 100,
    )
    db.session.query(Transaction).filter(*filters)
    
    0 讨论(0)
  • 2020-12-09 12:31
    def get_filter_by_args(dic_args: dict):
        filters = []
        for key, value in dic_args.items():  # type: str, any
            if key.endswith('___min'):
                key = key[:-6]
                filters.append(getattr(model_class, key) > value)
            elif key.endswith('___max'):
                key = key[:-6]
                filters.append(getattr(model_class, key) < value)
            elif key.endswith('__min'):
                key = key[:-5]
                filters.append(getattr(model_class, key) >= value)
            elif key.endswith('__max'):
                key = key[:-5]
                filters.append(getattr(model_class, key) <= value)
            else:
                filters.append(getattr(model_class, key) == value)
        return filters
    
    dic_args = {
        'is_created': 1,
        'create_time__min': 1588125484029,
    }
    filters = get_filter_by_args(dic_args)
    lst = session.query(model_class).filter(*filters)
    
    0 讨论(0)
提交回复
热议问题