Kendi yöntemleri eklemek üssü Query
sınıf alt sınıf:
from sqlalchemy.orm import Query
class MyQuery(Query):
def all_active(self):
return self.filter(User.is_active == True)
Eğer oturumu (docs here) oluştururken Daha sonra, bu yeni sorgu sınıfını kullanmak SQLAlchemy söyle. Kodunuzdaki itibaren Flask-SQLAlchemy kullanıyor olabilir gibi görünüyor, bu nedenle aşağıdaki gibi yapardı:
db = SQLAlchemy(session_options={'query_cls': MyQuery})
Aksi takdirde sessionmaker
doğrudan argüman geçerdi:
sessionmaker(bind=engine, query_cls=MyQuery)
sağ itibariyle şimdi, bu yeni sorgu nesnesi bu ilginç değil çünkü biz User
sınıfını bu yöntemde kodladık, bu yüzden başka bir şey için çalışmayacak. Daha iyi bir uygulama, hangi filtrenin uygulanacağını belirlemek için sorgunun temel sınıfını kullanır. Bu biraz zor ama aynı zamanda yapılabilir:
class MyOtherQuery(Query):
def _get_models(self):
"""Returns the query's underlying model classes."""
if hasattr(query, 'attr'):
# we are dealing with a subquery
return [query.attr.target_mapper]
else:
return [
d['expr'].class_
for d in query.column_descriptions
if isinstance(d['expr'], Mapper)
]
def all_active(self):
model_class = self._get_models()[0]
return self.filter(model_class.is_active == True)
Son olarak, bu yeni sorgu sınıfı dinamik ilişkiler tarafından kullanılmayacaktır (eğer varsa). Eğer ilişki oluştururken argüman olarak geçebilir, bu da onu kullanmasına izin vermek için:
users = relationship(..., query_class=MyOtherQuery)
acaba bu diğer [soru/cevap] içinde herhangi bir şey (http://stackoverflow.com/questions/7604967/ sqlalchemy-build-query-filtre-dinamik-in-dict) bunun için herhangi bir kullanım olabilir? (Özel bir yöntemden daha az ... ve özel bir dinamik filtrenin daha fazlası.) – summea