By fake I mean the field is not present in db, but present in model and
calculated when model is loaded. Favorite is a fields for Book model and
can be represented by something similar to:
class Book(Base):
id = Column(...)
name = Column(...)
favorite_for = relationship(User, secondary=UserFavoriteBooks,
backref=favorite_books)
@property
def favorite(self)
return request.user.id in [u.id for u in self.favorite_for]
request is global here.
But I wan't it to be calculated once model is loaded, I think that could be
achieved by column_property by select() with case() to check if current
user is in the favorite_for list. If column_property is not refreshed for
every query it will be fine for this example (since user is the same in
scope of one http request, so doesn't change during session lifetime), but
could be a problem for other models if I compare (in where clause) to
something with more dynamic nature. I just wonder if there is a mechanism
in SQLAlchemy that allows to have model fields that calculated at query
time and can be configured before the query is emitted.
I can extend my example: backend renders reply with list of users, for each
user there is a list of books they bought, and for each book there is a
favorite filed which tells if this book bought by this user is marked as
favorite for him:
[{
name: "John Doe",
books: [{
name: "foo",
favorite: true
},
{
name: "bar",
favorite: false
}
}]
},
{
name: "Jane Roe",
books: [{
name: "foo",
favorite: false
},
{
name: "bar",
favorite: true
}
}]
On Monday, February 6, 2017 at 7:13:02 PM UTC+3, Mike Bayer wrote:
>
>
>
> On 02/06/2017 11:02 AM, Евгений Иванов wrote:
> > I need a dynamically calculated column for my model. column_property
> > looks great for that, but problem here that it's compiled at time when
> > model is mapped and I need to provide some value for filtering at time
> > the request is executed. I thought that bindparam can solve that problem
> > for me, but found that topic:
> >
> https://bitbucket.org/zzzeek/sqlalchemy/issues/3620/new-query-doesnt-expire-column_property
>
> >
> > this is not really a great way to use column_property as it is
> > treated like any other persisted attribute, and is not reloaded
> > unnecessarily.
>
>
> you can use column_property with a bound parameter it just wont normally
> be refreshed if you query for the same object again when it's already
> loaded. it depends on what you want things to do.
>
>
> > |
> > User:
> > id
> > name
> >
> > Book:
> > id
> > name
> >
> > UserFavoriteBooks:
> > user_id
> > book_id
> > |
> >
> > So I have many-to-many relation between users and books to represent
> > list of favorite books for a user. Then some user queries a book from DB
> > and want to know if it's in his favorite list, so I need to query the
> > Book entry for db with some fake bool column "favorite" which is checked
> > over the current user (who performed the request). Is it possible to do
> > that in SQLAlchemy so the "favorite" fields is automatically filled with
> > correct value once I do a query for a Book?
>
> what's a "fake" column? if "favorite" is a column in UserFavoriteBooks
> you'd use the association object pattern, i dont see where the
> column_property/bind thing is used there.
>
>
>
> >
> > BR, Evgeny
> >
> > --
> > SQLAlchemy -
> > The Python SQL Toolkit and Object Relational Mapper
> >
> > http://www.sqlalchemy.org/
> >
> > To post example code, please provide an MCVE: Minimal, Complete, and
> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> > description.
> > ---
> > 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 [email protected] <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > To post to this group, send email to [email protected]
> <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.