Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLAlchemy equivalent of named scopes in ActiveRecord

Is there an equivalent of AR's named scopes? Named scopes are basically filters, that can be wrapped in a method, and then chained.

Here's an example from http://archives.ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know:

class Article < ActiveRecord::Base

  # Get all articles that have been published
  named_scope :published, :conditions => ['published = ?', true]

  # Get all articles that were created recently
  named_scope :recent, lambda { { :conditions => ['created_at >= ?', 1.week.ago] } }

end

# Get all recently created articles that have been published
Article.published.recent

Here's an example using Django ORM: http://furrybrains.com/2009/06/22/named-scopes-for-django/

like image 462
Vlad Zloteanu Avatar asked Jan 30 '13 08:01

Vlad Zloteanu


1 Answers

SQLAlchemy has hybrid attributes, which you could use to build any sort of system:

from sqlalchemy.ext.hybrid import hybrid_property


class Article(Base):
    @hybrid_property
    def published(self):
        return self.is_published == True

    @hybrid_property
    def recent(self):
        # this relies on the date arithmetic of the target backend
        return datetime.now() - self.created_at >= datetime.timedelta(days=7)


articles = query(Article).filter(Article.published, Article.recent).all()
like image 162
zzzeek Avatar answered Sep 28 '22 03:09

zzzeek