【问题标题】:What's the proper way of handling business logic in Flask SQLALchemy models?在 Flask SQLALchemy 模型中处理业务逻辑的正确方法是什么?
【发布时间】:2021-10-11 16:35:13
【问题描述】:

我想知道从模型中检索数据的正确方法是什么。我们以下面的类为例:

class A(db.Model):
   def get_attributes():
       return self.product_category.attributes
class Attribute(db.Mdel):
    attribute_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    label = db.Column(db.String(255), nullable=False)

假设调用 get_attributes() 返回 Attribute 类的三个对象。

在我的路线中,我只想接收属性标签列表。我目前正在做的是遍历对象并检索标签属性,如下所示:

labels = [i.label for i in obj.get_attributes()]

我认为这不是正确的做法。有没有更好的方法来实现这一点?

【问题讨论】:

    标签: python flask model flask-sqlalchemy crud


    【解决方案1】:

    你应该在 A 和 Attribute 之间使用relationship

    例如

    class A(db.Model):
        # ...
        # table primary key, columns etc.
        # ...
        attributes = db.relationship(
            "Attribute",
            backref="as",
            lazy=True
        )
    
    class Attribute(db.Model):
        # ...
        # table primary key, columns etc.
        # ...
        a_id = db.Column(db.Integer, db.ForeignKey('a.id'))
    

    之后,您可以使用 a.attributes 访问某些“a”属性。要为“a”添加属性,只需:a.attributes.append(a)

    【讨论】:

    • 我正在使用关系,我没有将它包含在代码中,因为它会很大,这不是问题所在。问题是关于如何以正确的方式检索对象的某些属性
    • 我猜你应该关注lazy参数。您可以将属性检索为一种列表。你现在的做法。这样,当您请求 A 行时,您会收到预加载在 a.attributes 中的所有属性。或者您可以选择lazy='dynamic' - 在请求A 之后,a.attributes 将不存储数据,而只存储准备就绪的请求以访问它。在某些情况下,这种方式可以提高内存效率。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2016-05-20
    • 2011-09-07
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多