python ORM风暴中的复合外键引用

时间:2011-11-14 11:32:56

标签: python storm-orm

这是我的模特:

class ProductCategory(Storm):
    __storm_table__ = 'product_category'

    pcat_no = Int(primary = True)
    pcat_name = Unicode()

    pitem = ReferenceSet(pcat_no, 'ProductItem.pcat_id')
    catpurchase = ReferenceSet(pcat_no, 'Purchase.pcategory_id')

class ProductItem(Storm):
    __storm_table__ = 'product_item'
    __storm_primary__ = 'pcat_id', 'pitem_no'

    pcat_id = Int()
    pitem_no = Int()
    pitem_name = Unicode()

    pcat = Reference(pcat_id, ProductCategory.pcat_no)
    purchase = ReferenceSet([pcat_id, pitem_no], [Purchase.pcategory_id, Purchase.pitem_id])

class Purchase(Storm):
    __storm_table__ = 'purchase'

    id = Int(primary = True)
    date = Date()
    pcategory_id = Int() # it must refer to pcat_no of ProductCategory & pcat_id of ProductItem
    pitem_id = Int() # It must refer to pitem_no of ProductItem

    pcategory = Reference(pcategory_id, ProductCategory.pcat_no)
    product = Reference([pcategory_id, pitem_id], [ProductItem.pcat_id, ProductItem.pitem_no])

条件是我想要选择类别或类别&表格中提供的项目(每个项目都有下拉列表)。 并希望提及类别详细信息或类别和&项目详细信息与referenceset。 我想用category_no&列出购买记录。 name(如果只提供了pcategory_id)或category_no& name,item_no&名称如果类别和&项目已提供。 &安培;插入满足我要求的记录。 我遇到的主要问题是我用以下列表记录:

print purchase_record.pcategory.pcat_name #it works fine but,
print purchase_record.product.pitem_name # it gives the error "RuntimeError: Reference used in an unknown class"
#thought 'purchase_record.pitem_id' holds some value

我正在使用烧瓶,&风暴如ORM。有什么办法可以获得产品类别名称&产品项目名称和表格中的适当参考?

1 个答案:

答案 0 :(得分:0)

这里的问题是您使用列表来声明复合键。如果您使用元组,那么您的示例应该按预期工作:

class Purchase(Storm):
    ...
    product = Reference((pcategory_id, pitem_id), (ProductItem.pcat_id, ProductItem.pitem_no))

虽然错误消息有点不透明,但是有理由不在这里使用列表:引用的两端不应该改变,所以像列表这样的可变类型并不合适。