[storm] subclassing and foreign keys with respect to properties from parent

Olaf Conradi olaf at conradi.org
Sat Aug 23 10:54:54 BST 2008

Hi Jamu,

2008/8/22 Jamu Kakar <jkakar at kakar.ca>:
> I'm not sure exactly why your code doesn't work.  I've written a
> doctest to describe this pattern and to provide working code
> examples.  I'll be pushing this in a branch to get it included along
> with other Storm doctests.  Here it is (it works):

Thanks for writing this. This helped me make my implementation cleaner.
I like the StoredPersonInfo classes to factor out the common part of
binding Info classes to the Person class.

The mistake I made in my previous implementation was that I tried to
keep an id in the person table to the info classes table.
But because of the info property it is not needed and every info class
already stored a foreign key to the person class. So it was redundant

It's working fine now. Thanks.

> The infoheritance pattern uses composition instead of inheritance to work
> around the multiple table limitation.  A base Storm class is used to
> represent
> all objects in the hierarchy.  Each instance of this base class has an info
> property that yields an instance of a specific info class.  An info class
> provides the additional data and behaviour you'd normally implement in a
> subclass.  Following is the design from above converted to use the pattern.
> ...
> ...     @property
> ...     def info(self):
> ...         if self._info is not None:
> ...             return self._info
> ...         assert self.id is not None
> ...         info_class = person_info_types[self.info_type]
> ...         if not hasattr(info_class, "__storm_table__"):
> ...             info = info_class.__new__(info_class)
> ...             info.person = self
> ...         else:
> ...             info = Store.of(self).get(info_class, self.id)

I am using seperate id's for each info_class

            info = Store.of(self).find(info_class,
                                       info_class.person_id == self.id

> ...         self._info = info
> ...         return info
>>>> class PersonInfo(object):
> ...
> ...     def __init__(self, person):
> ...         self.person = person
>>>> class StoredPersonInfo(PersonInfo):

A new id for every info class

    id = Int(allow_none=False, primary=True)

> ...     person_id = Int(allow_none=False, primary=True)

    person_id = Int(allow_none=False)

> ...     person = Reference(person_id, Person.id)

More information about the storm mailing list