我如何使用 flask-admin column_sortable_list 与数据库关系
How do i use flask-admin column_sortable_list with a database relationship
我正在制作一个使用 flask-admin
进行数据库管理的 flask
网站。我正在尝试对包含外键的列进行排序。
我的一个 flask-admin 模型视图用于中间 table,我想按与另一个 [= 有关系的列对我视图中的 table 进行排序39=]。由于某种原因 column_default_sort = 'pizza_id'
对列表进行排序,但 column_sortable_list = ('pizza_id',)
不起作用
这是目前的样子
我想要的是 Pizza
table header 像 Id
一样是蓝色的,这意味着它可以单击它并且它将按该列排序。下面给出一个例子
这是我的 sqlalchemy 模型
class Topping(db.Model):
__tablename__ = 'toppings'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False, unique=True)
description = db.Column(db.Text)
price = db.Column(db.Float, nullable=False)
def __repr__(self):
return f"{self.name}"
class Pizza(db.Model):
__tablename__ = 'pizza'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False, unique=True)
description = db.Column(db.String)
extra_price = db.Column(db.Float)
toppings = db.relationship('Topping', secondary='pizza_toppings')
def __repr__(self):
return self.name
# my pizza intermediate table
class PizzaTopping(db.Model):
__tablename__ = 'pizza_toppings'
id = db.Column(db.Integer, primary_key=True)
pizza = db.relationship('Pizza', primaryjoin='PizzaTopping.pizza_id == Pizza.id', backref='pizza_toppings')
topping = db.relationship('Topping', primaryjoin='PizzaTopping.topping_id == Topping.id', backref='pizza_toppings')
pizza_id = db.Column(db.ForeignKey('pizza.id'), nullable=False)
topping_id = db.Column(db.ForeignKey('toppings.id'), nullable=False)
这是我的 flask-admin 模型视图
class MyModelView(ModelView):
can_set_page_size = True
page_size = 15
column_display_pk = True
column_display_all_relations = True
column_sortable_list = ('pizza_id',)
column_default_sort = 'pizza_id'
can_export = True
def is_accessible(self):
return current_user.is_authenticated and current_user.has_roles(("owner", 'admin'))
def inaccessible_callback(self, name, **kwargs):
return redirect('/')
非常感谢任何帮助,如果您需要更多信息,请询问。
使用点关系属性。例如按披萨名称或配料名称排序:
class MyModelView(ModelView):
# ...
column_sortable_list = ('pizza.name', 'topping.name', 'id')
# ...
已接受的答案对我不起作用。如果它对其他人不起作用,这就是我解决问题的方法:
第一种方式,如果您像上面的示例那样在模型中声明了与外键的关系,您的答案将如下所示:
class MyModelView(ModelView):
column_sortable_list = ('pizza', ('pizza_id', Pizza.name)) # or more generally: ('RelationshipName', ('Foreign Key you want to sort', ModelName.ColumnYouWantToSortBy))
第二种方式,如果您像我一样并且在外键引用模型中定义了您的关系。在这种情况下:
class PizzaTopping(db.Model):
...
pizza_id = db.Column(db.ForeignKey('pizza.id'), nullable=False)
...
class Pizza(db.Model):
...
pizza = db.relationship('PizzaTopping', backref='pizza_toppings')
...
现在在模型视图中,您只需更改 RelationshipName 而不是使用 backref。
class MyModelView(ModelView):
column_sortable_list = ('pizza_toppings', ('pizza_id', Pizza.name))
我正在制作一个使用 flask-admin
进行数据库管理的 flask
网站。我正在尝试对包含外键的列进行排序。
我的一个 flask-admin 模型视图用于中间 table,我想按与另一个 [= 有关系的列对我视图中的 table 进行排序39=]。由于某种原因 column_default_sort = 'pizza_id'
对列表进行排序,但 column_sortable_list = ('pizza_id',)
不起作用
这是目前的样子
Pizza
table header 像 Id
一样是蓝色的,这意味着它可以单击它并且它将按该列排序。下面给出一个例子
这是我的 sqlalchemy 模型
class Topping(db.Model):
__tablename__ = 'toppings'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False, unique=True)
description = db.Column(db.Text)
price = db.Column(db.Float, nullable=False)
def __repr__(self):
return f"{self.name}"
class Pizza(db.Model):
__tablename__ = 'pizza'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False, unique=True)
description = db.Column(db.String)
extra_price = db.Column(db.Float)
toppings = db.relationship('Topping', secondary='pizza_toppings')
def __repr__(self):
return self.name
# my pizza intermediate table
class PizzaTopping(db.Model):
__tablename__ = 'pizza_toppings'
id = db.Column(db.Integer, primary_key=True)
pizza = db.relationship('Pizza', primaryjoin='PizzaTopping.pizza_id == Pizza.id', backref='pizza_toppings')
topping = db.relationship('Topping', primaryjoin='PizzaTopping.topping_id == Topping.id', backref='pizza_toppings')
pizza_id = db.Column(db.ForeignKey('pizza.id'), nullable=False)
topping_id = db.Column(db.ForeignKey('toppings.id'), nullable=False)
这是我的 flask-admin 模型视图
class MyModelView(ModelView):
can_set_page_size = True
page_size = 15
column_display_pk = True
column_display_all_relations = True
column_sortable_list = ('pizza_id',)
column_default_sort = 'pizza_id'
can_export = True
def is_accessible(self):
return current_user.is_authenticated and current_user.has_roles(("owner", 'admin'))
def inaccessible_callback(self, name, **kwargs):
return redirect('/')
非常感谢任何帮助,如果您需要更多信息,请询问。
使用点关系属性。例如按披萨名称或配料名称排序:
class MyModelView(ModelView):
# ...
column_sortable_list = ('pizza.name', 'topping.name', 'id')
# ...
已接受的答案对我不起作用。如果它对其他人不起作用,这就是我解决问题的方法:
第一种方式,如果您像上面的示例那样在模型中声明了与外键的关系,您的答案将如下所示:
class MyModelView(ModelView):
column_sortable_list = ('pizza', ('pizza_id', Pizza.name)) # or more generally: ('RelationshipName', ('Foreign Key you want to sort', ModelName.ColumnYouWantToSortBy))
第二种方式,如果您像我一样并且在外键引用模型中定义了您的关系。在这种情况下:
class PizzaTopping(db.Model):
...
pizza_id = db.Column(db.ForeignKey('pizza.id'), nullable=False)
...
class Pizza(db.Model):
...
pizza = db.relationship('PizzaTopping', backref='pizza_toppings')
...
现在在模型视图中,您只需更改 RelationshipName 而不是使用 backref。
class MyModelView(ModelView):
column_sortable_list = ('pizza_toppings', ('pizza_id', Pizza.name))