Given all this "magic" with .with_polymorphic(), I'm now wondering if it's really worth to have a new Query class (by subclassing orm.Query) per mapped object just to apply some filters...

At first I found quite elegant to have one Query object per mapped class, but now I'm wondering if it's not better after all to have a bunch of @staticmethod in the model ...

What do you think ?

On 10/13/2010 11:21, Julien Cigar wrote:
On 10/12/2010 18:05, Julien Cigar wrote:
On 10/12/2010 17:09, Michael Bayer wrote:
On Oct 12, 2010, at 7:39 AM, Julien Cigar wrote:

Hello,

any idea why with

# Query

class BaseQuery(orm.Query):
@dynamic
def method_a(self):
...
def method_b(self):
...

class FooQuery(BaseQuery):
...

class BarQuery(FooQuery):
@dynamic
def method_c(self):
...

# Models

class BaseModel(object):
query = Session.query_property(BaseQuery)

#

myQuery = type('PolymorphicQuery, (content.BaseQuery, ),
func_list)(BaseModel)

where "func_list" containing all the functions decorated by @dynamic
the following fail? :

- myQuery.get(45) fails with: AttributeError: 'NoneType' object has
no attribute 'identity_map'
- myQuery.method_a().all() fails with: AttributeError: 'NoneType'
object has no attribute '_autoflush'
- etc


OK I think I found a solution, I need to pass session=Session.registry()
to my custom query:

 >>> model.content.ContentQuery.__mro__
(<class 'amnesia.model.content.ContentQuery'>, <class
'amnesia.model.root.RootQuery'>, <class 'sqlalchemy.orm.query.Query'>,
<type 'object'>)
 >>> PolymorphicQuery = type('PolymorphicQuery',
(model.content.ContentQuery, ), {})
 >>> q1 = PolymorphicQuery(model.Content)
 >>> q1.get(25)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File
"/home/jcigar/venvs/pylons0.9.7/lib/python2.5/site-packages/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/orm/query.py",
line 595, in get
return self._get(key, ident)
File
"/home/jcigar/venvs/pylons0.9.7/lib/python2.5/site-packages/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/orm/query.py",
line 1803, in _get
instance = self.session.identity_map.get(key)
AttributeError: 'NoneType' object has no attribute 'identity_map'
 >>> q2 = PolymorphicQuery(model.Content, session=meta.Session.registry())
 >>> q2.get(25)
<amnesia.model.event.Event object at 0x939046c>

I hope I'm not doing something wrong :p

My goal is to be able to build a custom Query object to use with the
.with_polymorphic() function ..
I've just grepped through all the source, examples and tests plus the
wiki trying to find what @dynamic is. Seems like something I'd have
come up with in the past but I've no clue at the moment what that is.



Sorry, I forgot to mention that it's just a custom decorator of mine
which add the function name to a list ... forget about it, it's just to
build the third argument of type() (func_list in my case)




--
No trees were killed in the creation of this message.
However, many electrons were terribly inconvenienced.

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

<<attachment: jcigar.vcf>>

Reply via email to