Tengo una relación de varios a varios entre entradas de blog y etiquetas. Ahora quiero saber cuántas entradas tiene una etiqueta específica.Contar el número de filas en una relación de varios a varios (SQLAlchemy)
Imagínese los siguientes modelos (simplificado):
rel_entries_tags = Table('rel_entries_tags', Base.metadata,
Column('entry_id', Integer, ForeignKey('entries.id')),
Column('tag_id', Integer, ForeignKey('tags.id'))
)
class Entry(Base):
__tablename__ = 'entries'
id = Column(Integer, primary_key=True)
title = Column(String(80))
text = Column(Text)
tags = relationship('Tag', secondary=rel_entries_tags, backref=backref('entries'))
def __init__(self, title, text):
self.title = title
self.text = text
self.tags = tags
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True, nullable=False)
def __init__(self, name):
self.name = name
Mi acercamiento a contar la cantidad de entradas para una etiqueta es len(db_session.query(Tag).get(1).entries)
. El problema es que cuando se obtiene db_session.query(Tag).get(1).entries
, SQLAlchemy selecciona todas las entradas con todas sus columnas para una etiqueta; sin embargo, solo deseo la cantidad de las entradas, no las entradas mismas. ¿Hay un enfoque más óptimo para este problema?
Gracias.
+1: y si necesita esto a menudo, puede crear una propiedad: '@property \ n def entries_cnt (auto): \ n return Session.object_session (self) .query (Entry) .with_parent (self, "entries"). count() ' – van
Gracias por esta respuesta. Sin embargo, la instrucción SQL producida es 'SELECT count (*) AS count_1 FROM (SELECT order_line.id AS order_line_id, order_line.order_id AS order_line_order_id FROM order_line WHERE% (param_1) s = order_line.order_id) AS anon_1' En otras palabras - en lugar de un 'SELECT count (*) FROM order_line WHERE order_line.order_id =% (param_1) s' obtenemos un SELECT interno. En mi caso, no es de uno a muchos (Order tiene muchos OrderLine). – guyarad
hacer una consulta (func.count ('*')) en primer plano. La [cuenta() documentación] (http://docs.sqlalchemy.org/en/latest/orm/query.html?highlight=query.count#sqlalchemy.orm.query.Query.count) se refiere a esto. – zzzeek