Составная ссылка на внешний ключ в Python ORM Storm - PullRequest
1 голос
/ 14 ноября 2011

Вот моя модель:

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])

Условие состоит в том, что я хочу выбрать либо только категорию, либо и категорию и элемент, доступные из таблиц (с раскрывающимся списком на каждой). И хотел бы иметь ссылки обратно на детали категории ИЛИ как категории, так и детали товара с набором ссылок. Я хочу перечислить запись покупки с категорией и именем (если указан только pcategory_id) ИЛИ категорией и именем, имя_позиции и именем, если указана категория и элемент. & вставьте запись, которая соответствует моему требованию. Основная проблема, с которой я сталкиваюсь - это когда я перечисляю запись с:

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 голосов
/ 29 августа 2012

Проблема в том, что вы используете списки для объявления ваших составных ключей. Если вместо этого вы используете кортежи, ваш пример должен работать как положено:

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

Хотя сообщение об ошибке немного непрозрачно, здесь есть причины не использовать списки: два конца ссылки не должны изменяться, поэтому изменчивый тип, такой как список, не совсем подходит.

...