Вот текущий запрос.
likes = sqlalchemy.orm.aliased(Counter)
q = Video.query()
q = q.filter(Video.lifecycle_status == "created")
q = q.filter(Video.release_status == "public")
tags = dict(role="video", format="hls")
for name, value in tags.items():
tag = sqlalchemy.orm.aliased(VideoMaterialTag)
q = q.join(Video.materials)
q = q.join(tag, VideoMaterial.tags)
q = q.filter(tag.name == name)
q = q.filter(tag.value == value)
q = q.outerjoin(
likes,
(likes.table_name == "tungsten_video")
& (likes.row_id == Video.id)
& (likes.name == "videos_public"),
)
q = q.order_by(likes.value.desc().nullslast())
q = q.distinct()
q = q.options(
sqlalchemy.orm.joinedload(Video.creator)
.load_only("id", "username", "avatar")
)
q = q.options(
sqlalchemy.orm.joinedload(Video.song)
.load_only("id", "title")
)
q = q.options(
sqlalchemy.orm.joinedload(Video.materials)
.load_only("file")
.joinedload(VideoMaterial.tags)
.load_only("name", "value")
)
Этот код работает очень хорошо, но я борюсь с этими моментами.
- В настоящее время он выбирает все поля из Модель видео, я хотел бы выбрать только
id
и role
. - Я также хотел бы выбрать
likes.value
, а имя num_likes
.
Я попытался заменить вторую строку этим.
q = Video.query(Video.id, Video.role, likes.value.label("num_likes"))
Но это приводит к трассировке стека, которая заканчивается следующим образом.
File "/home/thnee/.python-venvs/platinum/lib/python3.6/site-packages/sqlalchemy/orm/strategy_options.py", line 885, in _find_entity_prop_comparator
% (util.clsname_as_plain_name(type(prop)), prop)
sqlalchemy.exc.ArgumentError: Query has only expression-based entities, which do not apply to relationship property "Video.creator"
Я попытался добавить эту строку.
q = q.options(sqlalchemy.orm.load_only("id", "role", likes.value.label("num_likes")))
Но это приводит к трассировке стека, которая заканчивается следующим образом.
File "/home/thnee/.python-venvs/platinum/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 522, in __bool__
raise TypeError("Boolean value of this clause is not defined")
TypeError: Boolean value of this clause is not defined