wtforms-sqlalchemy icon indicating copy to clipboard operation
wtforms-sqlalchemy copied to clipboard

QuerySelectField's query_factory callable not used when assigned through model_form's field_args

Open bglogic opened this issue 4 years ago • 0 comments

Background

In the example below, assuming parent is a many-to-one field that maps to a QuerySelectField, The query_factory's callable (get_all_except_first) will not be used, it just returns all records of the model. On the other hand, using a normal form works as expected.

def get_all_except_first():
    return Example.query.filter(Example.id != 1)

# This doesn't work
ExampleForm = model_form(
    Example,
    field_args={
        "parent": {"query_factory": get_all_except_first}
        ...
    }
    ...
)

# This works
class ExampleForm(FlaskForm):
    parent = QuerySelectField(query_factory=get_all_except_first)
    ...

Failed debugging attempts

Got confused when attempting to debug code similar to the example above (using model_form):

  1. Printing field_args in the conv_ManyToOne method shows that query_factory points to <function ModelConverterBase.convert.<locals>.<lambda> at 0x1076a3b80>.
  2. Using the debugger to inspect field_args in the conv_ManyToOne method shows that it doesn't contain query_factory

https://github.com/wtforms/wtforms-sqlalchemy/blob/9884ab82ffd51a14dc2778468d428985d4c8e26b/wtforms_sqlalchemy/orm.py#L232-L234

bglogic avatar Aug 18 '21 18:08 bglogic