如何与数据库关系使用flask-admin column_sortable_list

时间:2019-03-26 03:12:43

标签: python python-3.x flask flask-sqlalchemy flask-admin

我正在建立一个flask网站,该网站使用flask-admin进行数据库管理。我正在尝试对包含外键的列进行排序。

我的flask-admin模型视图之一是用于中间表的,我想通过与另一表有关系的列对视图上的表进行排序。由于某些原因,column_default_sort = 'pizza_id'对列表进行了排序,但是column_sortable_list = ('pizza_id',)不起作用

这是当前的外观 table in view 我想要的是Pizza表头是蓝色的,就像Id一样,这意味着它可以单击它并将按该列排序。下面是一个例子

Imgur

这是我的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('/')

非常感谢您的帮助,如果您需要更多信息,请询问。

2 个答案:

答案 0 :(得分:1)

接受的答案对我不起作用。如果它对其他人不起作用,这是我解决问题的方法:

第一种方法,如果您像上面的示例一样使用外键声明模型中的关系,您的答案将如下所示:

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')
...

现在在模型视图中,您需要更改的只是使用 backref 而不是 RelationshipName。

class MyModelView(ModelView):
     column_sortable_list = ('pizza_toppings', ('pizza_id', Pizza.name))

答案 1 :(得分:0)

使用虚线关系属性。例如按披萨名称或浇头名称排序:

class MyModelView(ModelView):

    # ...
    column_sortable_list = ('pizza.name', 'topping.name', 'id')
    # ...