У меня проблема с преобразованием этого SQL-запроса в SQLAlchemy
SELECT Recipe.id, Recipe.name, AVG(Rating.rating) AS ar FROM Recipe LEFT OUTER JOIN Rating ON Recipe.id = Rating.recipe_id GROUP BY Recipe.id ORDER BY Recipe.id ASC;
В настоящее время у меня есть:
session.query(Recipe,func.avg(Rating.rating).label('average')).outerjoin(Rating).filter(Recipe.id == Rating.recipe_id).group_by(Recipe.id).all()
но это возвращает нечто похожее на это, в котором отсутствуют элементы, которые не имеют каких-либо рейтингов:
id | name | ar
----+------------------+--------------------
1 | First Response | 4.0000000000000000
34 | First Response 2 | 3.0000000000000000
В то время как запрос PostgreSQL в командной строке возвращает:
id | name | ar
----+------------------+--------------------
1 | First Response | 4.0000000000000000
34 | First Response 2 | 3.0000000000000000
35 | First Response 2 |
36 | First Response 2 |
Это моимодели:
class Recipe(Base):
__tablename__ = 'recipe'
id = Column(Integer, primary_key=True)
name = Column(String)
prep_time = Column(Integer)
difficulty = Column(Integer)
vegeterian = Column(Boolean)
user_id = Column(Integer, ForeignKey('user.id'))
ratings = relationship("Rating")
def __repr__(self):
return "<Recipe(name='{}', prep_time='{}', difficulty='{}', vegeterian='{}', user='{}')>".format(
self.name, self.prep_time, self.difficulty, self.vegeterian, self.user_id
)
class Rating(Base):
__tablename__ = 'rating'
id = Column(Integer, primary_key=True)
recipe_id = Column(Integer, ForeignKey('recipe.id'))
rating = Column(Integer)
def __repr__(self):
return "<Rating(name='{}', rating='{}')>".format(self.recipe.name, self.rating)
Любая помощь будет принята с благодарностью!Большое спасибо.