Найти - Пользователи
Полная версия: Flask-Admin relationship many-to-many создать свой filter или search [решено]
Начало » Web » Flask-Admin relationship many-to-many создать свой filter или search [решено]
1
alexbadaloff
Модели такие:

 class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))
    def __str__(self):
        return self.name
roles_users = db.Table(
    'roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(255))
    last_name = db.Column(db.String(255))
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='select'))
    def __str__(self):
        return self.email

Еще есть свой фильтр:
 class FilterRole(filters.BaseSQLAFilter):
    def apply(self, query, value, alias=None):
        search = []
        for val in value.split(','):
            search.append(self.column.ilike(f'%{val}%')) #в self.column он не видит просто строку 'roles.name'
        return query.filter(or_(
            *search
        ))
    def operation(self):
        return 'custom_filter'

Пытаюсь указать поле roles но фильтр не знает как его в column преобразовать

 column_filters = (
        FilterRole(
            'roles.name', 'Roles'
        ),
        # 'roles.name', # а если так, то дефолтные фильтры работают
    )

Как свой фильтр заставить работать с этим полем?
alexbadaloff
Это заработало

 class FilterRole(filters.BaseSQLAFilter):
    def apply(self, query, value, alias=None):
        search = []
        for val in value.split(','):
            search.append(Role.name.ilike(f'%{val}%'))
        return query.join(User.roles).filter(or_(
            *search
        ))
    def operation(self):
        return 'regexp'

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB