On 02/06/2017 01:45 PM, Евгений Иванов wrote:
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.

why don't you use a relationship() with the bound parameter? there's a recipe for this at https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/GlobalFilter. I guess it's a little more up-front code than the column_property() but once you have it, you get this cool effect:

    obj = session.query(MyObject).\
          options(WithFavoriteItem(request.params['favorite_id'])).\
          one()




 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.


Well your immediate use case is per-request. I'd propose YAGNI for the "what if? what if?" part of this because this is not really a common use case.


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.

that's what we're doing here w/ both the column_property you were doing and the relationship.

If you want the column and/or relationship loaded all at once when you do query(), and you're concerned it was already loaded, just do populate_existing() and that will load it no matter what.


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
    
<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
    <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 sqlalchemy+...@googlegroups.com <javascript:>
    > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>.
    > To post to this group, send email to sqlal...@googlegroups.com
    <javascript:>
    > <mailto:sqlal...@googlegroups.com <javascript:>>.
    > Visit this group at https://groups.google.com/group/sqlalchemy
    <https://groups.google.com/group/sqlalchemy>.
    > For more options, visit https://groups.google.com/d/optout
    <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 sqlalchemy+unsubscr...@googlegroups.com
<mailto:sqlalchemy+unsubscr...@googlegroups.com>.
To post to this group, send email to sqlalchemy@googlegroups.com
<mailto:sqlalchemy@googlegroups.com>.
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to