Thanks a lot! It works but I still have a problem. I want to make one query to get the root directory, all its children and the filenames of Image objects. My directory model looks like this:
class Directory(Node): is_root = db.Column(db.Boolean, default=False) children = db.relationship(Node, cascade_backrefs=False, backref=db. backref('parent', remote_side=[Node.id]), lazy='joined', join_depth=10) When I use the query that you suggested I get the filenames instantly but I don't get the eager loading of the children. I also tried this: db.session.query(Node).with_polymorphic([Directory, Image]).all() And I still only get the filenames without eager loading of Directory children. W dniu wtorek, 15 września 2015 17:17:12 UTC+2 użytkownik Michael Bayer napisał: > > > > On 9/15/15 10:09 AM, Jakub Bąk wrote: > > I used before_delete and after_commit and it works like a charm. Thanks > again! > > I have another problem related to this setup. I have a property defined on > the Image model: > > @property > def filename(self): > return '{basename}.{extension}'.format(basename=self.basename, > extension=self.extension) > > When I make this query: > > image = db.session.query(Image).get(100) > image.filename > > I get the filename property istantly but when I do it like this: > > node = db.session.query(Node).get(100) > node.filename > > Another query has to be issued which is not what I want. Do you know any > possible solution to that problem Michael? > > > that is again the way the joined-table inheritance works; by default it > only queries the base table. Per query you'd do it like this: > > session.query(Node).with_polymorphic(Image).get(100) > > > > > > > W dniu wtorek, 25 sierpnia 2015 17:16:16 UTC+2 użytkownik Michael Bayer > napisał: >> >> >> >> On 8/25/15 10:05 AM, Jakub Bąk wrote: >> >> I just came across a solution to this problem. Adding 'with_polymorphic': >> '*' to __mapper_args__ on the Node model was enough. >> >> class Node(db.Model): >> id = db.Column(db.Integer, primary_key=True) >> type = db.Column(db.String(20)) >> name = db.Column(db.String(30), nullable=False) >> date_added = db.Column(db.DateTime, default=datetime.now()) >> parent_id = db.Column(db.Integer, db.ForeignKey('node.id'), nullable= >> True) >> path = db.Column(db.String(200), default='') >> __mapper_args__ = {'polymorphic_on': type, >> 'with_polymorphic': '*' } >> >> >> OK, yeah that's a funny problem you have. The with_polymorphic in all >> cases is going to lead to heavier queries, because there's the join but >> also if you already have joins between Node classes, you'll start to see >> some very long queries with lots of joins / sub-joins. >> >> A more portable solution would be to also implement before_delete(), >> where you either ensure that the Image columns are loaded, or you add the >> files to be deleted to some kind of collection; then you'd actually delete >> the files using a safer event like after_commit(), so that way if your >> transaction fails, the files are preserved. >> >> >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sqlalchemy+...@googlegroups.com. >> To post to this group, send email to sqlal...@googlegroups.com. >> Visit this group at http://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. >> >> >> -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.