Bac Product
与ProductPicture
有一对多的关系。
我的产品图片模型如下:
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'
。有没有好办法呢。
由于
答案 0 :(得分:2)
如果您阅读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')")
示例会话:
>>> 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')]