[Grok-dev] Multiple models inside container
Martijn Faassen
faassen at startifact.com
Mon Mar 21 11:53:18 EDT 2011
On 03/17/2011 01:32 PM, Lumir Jasiok wrote:
[snip]
> But now I want to add Employee class, that will be similar to Store
> class. Inside Employee AddForm I want to save inside Awis context. After
> that I will not be able to recognize which ID belongs to Store object
> and Which to Employee object. How can I correctly save Store objects and
> Employees objects inside Awis container and be able to recognize them.
> Using dictionaries - self.context.stores and self.context.employees? -
> but how can I access those dictionaries from TAL?
>
> Or am I completely wrong and there is better way to do it?
There are different solutions.
You could create two containers and make them @grok.traversible and
store them in the Awis object, one for Employee and one for Store. You
might need to set up the sub-containers in an event handler for the add
event to make it set up right; not sure it works in the __init__(). This
would, I think, be the simplest approach and makes sure your objects are
in different containers altogether. Container making explicit subclasses
for the subcontainers, such as EmployeeContainer and StoreContainer, so
that you can create specific views for them and such later.
Alternatively you could indeed store everything withint Awis. One way to
distinguish the two is to simply use Python's isinstance() and loop
through the things in the container in some helper method:
def get_employees(self):
employees = []
for value in self.values():
if isinstance(value, Employee):
employees.append(value)
return employees
This won't be very fast if you have *many* employees or stores, though,
as it'll have to loop through them each time. Instead, you could
consider using the catalog. You can then index these things in the
catalog, and look them up quickly in the index. You'd probably have to
set up a "model_type" (or whatever name you pick) attribute on the
Store and Employee classes that you can index first:
class Employee(...):
model_type = 'employee'
setting up the catalog is something you need to google for.
Note that you can still use the catalog even if you spread things into
different containers as sketched out above.
Regards,
Martijn
More information about the Grok-dev
mailing list