python - SQLAlchemy一对多关系,如何过滤集合

标签 python filter sqlalchemy one-to-many

基本上 ProductProductPicture 具有一对多的关系。

我的产品图片模型是这样的:

picture_type_enums = ('main', 'related', 'option')

class ProductPicture(Base):

    __tablename__ = 'product_pictures'

    picture_id = Column(Integer, primary_key = True)
    product_id = Column(Integer, ForeignKey('products.product_id'))
    picture_type = Column(Enum(*picture_type_enums))
    url = Column(String(120))

我的产品模型是这样的:

class Product(Base):

    __tablename__ = 'products'

    product_id = Column(Integer, primary_key=True)
    product_name = Column(String(100))
    product_pictures = relationship("ProductPicture")

我的问题是对于一种产品,我可能有不同类型的产品图片。我知道如果我有一个 Product 实例 p,我可以调用 p.product_pictures 来获取所有类型的产品图片。但是,我想要类似 p.main_pictures 的东西,它获取类型为 'main' 的所有产品图片,而 p.option_pictures 获取所有 product_pictures 类型为 'option'。有什么好的方法吗?

谢谢

最佳答案

如果您阅读 sqlalchemy.orm.relationship 的文档,您可以看到您可以通过使用 primaryjoin 参数显式定义条件来进一步限制关系,并提供一个完美说明您所需场景的示例。根据您的要求进行调整,Product 类现在如下:

class Product(Base):

    __tablename__ = 'products'

    product_id = Column(Integer, primary_key=True)
    product_name = Column(String(100))
    product_pictures = relationship("ProductPicture")

    main_pictures = relationship("ProductPicture",
        primaryjoin="and_(Product.product_id==ProductPicture.product_id, "
                    "ProductPicture.picture_type=='main')")
    option_pictures = relationship("ProductPicture",
        primaryjoin="and_(Product.product_id==ProductPicture.product_id, "
                    "ProductPicture.picture_type=='option')")

示例 session :

>>> p = Product()
>>> p.product_name = 'test product'
>>> p.product_id = 1
>>> session.add(p)
>>> pic1 = ProductPicture()
>>> pic1.product_id = p.product_id
>>> pic1.picture_type = 'main'
>>> pic1.url = 'http://example.com/p1.main.png'
>>> session.add(pic1)
>>> pic2 = ProductPicture()
>>> pic2.product_id = p.product_id
>>> pic2.picture_type = 'option'
>>> pic2.url = 'http://example.com/p1.option1.png'
>>> session.add(pic2)
>>> pic3 = ProductPicture()
>>> pic3.product_id = p.product_id
>>> pic3.picture_type = 'option'
>>> pic3.url = 'http://example.com/p1.option2.png'
>>> session.add(pic3)
>>> session.commit()
>>> [(pic.picture_type, pic.url) for pic in p.product_pictures]
[(u'main', u'http://example.com/p1.main.png'), (u'option', u'http://example.com/p1.option1.png'), (u'option', u'http://example.com/p1.option2.png')]
>>> [(pic.picture_type, pic.url) for pic in p.main_pictures]
[(u'main', u'http://example.com/p1.main.png')]
>>> [(pic.picture_type, pic.url) for pic in p.option_pictures]
[(u'option', u'http://example.com/p1.option1.png'), (u'option', u'http://example.com/p1.option2.png')]

关于python - SQLAlchemy一对多关系,如何过滤集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24947160/

相关文章:

python - Firebase/Google Cloud Function 中 HTTP 请求的多次返回

android - 向 ListView 添加第二个过滤器

python - flask -sqlalchemy。电话号码类型

python - 使用 float 时 SQLAlchemy filter_by 查询失败

python - “模型”对象没有属性 'add' Keras Autoencoder

python - 为什么 Doc2vec 为相同的文本提供 2 个不同的向量

ruby-on-rails - Ruby on Rails - 根据用户选择的选项过滤记录

java - 文件名检查

python - Flask-WhooshAlchemy 与现有数据库

python - 尝试将 CSV 加载为 JSON 格式。似乎只获取 JSON 中指定的 CSV 的最后一行