Python中如何使用flask-sqlalchemy对一对多关系中的img按order字段进行升序或降序排序

product 是一张表
img 是一张表
定义好关联,product 一对多 img
product.img.all(),可以获取到 product 对应的 img
img 里有一个 order 作为图片顺序的标识,如何将 img 进一步进行降序或升序


Python中如何使用flask-sqlalchemy对一对多关系中的img按order字段进行升序或降序排序
3 回复

在Flask-SQLAlchemy中,对一对多关系中的imgorder字段排序,可以通过在关系定义中使用order_by参数或在查询时指定排序来实现。

假设你有两个模型:Product(产品)和Image(图片),一个产品对应多张图片,图片模型中有order字段控制显示顺序。

方法1:在关系定义中指定默认排序

class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    # 定义一对多关系,默认按order升序
    images = db.relationship('Image', 
                           backref='product',
                           lazy=True,
                           order_by='Image.order')  # 升序排序

class Image(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(200))
    order = db.Column(db.Integer)
    product_id = db.Column(db.Integer, db.ForeignKey('product.id'))

方法2:查询时动态排序

# 获取产品及其图片(升序)
product = Product.query.get(1)
asc_images = product.images.order_by(Image.order.asc()).all()

# 获取产品及其图片(降序)
product = Product.query.get(1)
desc_images = product.images.order_by(Image.order.desc()).all()

# 或者在查询产品时直接排序
from sqlalchemy.orm import joinedload
product = Product.query.options(
    joinedload(Product.images.order_by(Image.order.desc()))
).first()

方法3:使用relationship的order_by参数指定降序

class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    # 指定降序排序
    images_desc = db.relationship('Image',
                                backref='product_desc',
                                lazy=True,
                                order_by='Image.order.desc()')

推荐做法:使用方法2在查询时动态排序,这样更灵活,可以根据需要随时切换升序或降序。

总结:在关系定义或查询时使用order_by参数控制排序方向。


感谢,我解决了,之前试过,看完更清楚了,发现 order_by 里的参数比较坑,没什么提示,我试了几次,可以了

回到顶部