This commit is contained in:
parent
ed71405082
commit
f71fc7fde9
12
orm/draft.py
12
orm/draft.py
|
@ -6,6 +6,7 @@ from sqlalchemy.orm import relationship
|
||||||
from orm.author import Author
|
from orm.author import Author
|
||||||
from orm.topic import Topic
|
from orm.topic import Topic
|
||||||
from services.db import Base
|
from services.db import Base
|
||||||
|
from orm.shout import Shout
|
||||||
|
|
||||||
|
|
||||||
class DraftTopic(Base):
|
class DraftTopic(Base):
|
||||||
|
@ -62,3 +63,14 @@ class Draft(Base):
|
||||||
# Связь с Community (если нужна как объект, а не ID)
|
# Связь с Community (если нужна как объект, а не ID)
|
||||||
# community = relationship("Community", foreign_keys=[community_id], lazy="joined")
|
# community = relationship("Community", foreign_keys=[community_id], lazy="joined")
|
||||||
# Пока оставляем community_id как ID
|
# Пока оставляем community_id как ID
|
||||||
|
|
||||||
|
# Связь с публикацией (один-к-одному или один-к-нулю)
|
||||||
|
# Загружается через joinedload в резолвере
|
||||||
|
publication = relationship(
|
||||||
|
"Shout",
|
||||||
|
primaryjoin="Draft.id == Shout.draft",
|
||||||
|
foreign_keys="Shout.draft",
|
||||||
|
uselist=False,
|
||||||
|
lazy="noload", # Не грузим по умолчанию, только через options
|
||||||
|
viewonly=True # Указываем, что это связь только для чтения
|
||||||
|
)
|
|
@ -74,8 +74,8 @@ async def load_drafts(_, info):
|
||||||
"""
|
"""
|
||||||
Загружает все черновики, доступные текущему пользователю.
|
Загружает все черновики, доступные текущему пользователю.
|
||||||
|
|
||||||
Предварительно загружает связанные объекты (topics, authors), чтобы избежать
|
Предварительно загружает связанные объекты (topics, authors, publication),
|
||||||
ошибок с отсоединенными объектами при сериализации.
|
чтобы избежать ошибок с отсоединенными объектами при сериализации.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: Список черновиков или сообщение об ошибке
|
dict: Список черновиков или сообщение об ошибке
|
||||||
|
@ -89,16 +89,17 @@ async def load_drafts(_, info):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with local_session() as session:
|
with local_session() as session:
|
||||||
# Предзагружаем authors и topics
|
# Предзагружаем authors, topics и связанную publication
|
||||||
drafts = (
|
drafts_query = (
|
||||||
session.query(Draft)
|
session.query(Draft)
|
||||||
.options(
|
.options(
|
||||||
joinedload(Draft.topics),
|
joinedload(Draft.topics),
|
||||||
joinedload(Draft.authors)
|
joinedload(Draft.authors),
|
||||||
|
joinedload(Draft.publication) # Загружаем связанную публикацию
|
||||||
)
|
)
|
||||||
.filter(Draft.authors.any(Author.id == author_id))
|
.filter(Draft.authors.any(Author.id == author_id))
|
||||||
.all()
|
|
||||||
)
|
)
|
||||||
|
drafts = drafts_query.all()
|
||||||
|
|
||||||
# Преобразуем объекты в словари, пока они в контексте сессии
|
# Преобразуем объекты в словари, пока они в контексте сессии
|
||||||
drafts_data = []
|
drafts_data = []
|
||||||
|
@ -106,6 +107,17 @@ async def load_drafts(_, info):
|
||||||
draft_dict = draft.dict()
|
draft_dict = draft.dict()
|
||||||
draft_dict["topics"] = [topic.dict() for topic in draft.topics]
|
draft_dict["topics"] = [topic.dict() for topic in draft.topics]
|
||||||
draft_dict["authors"] = [author.dict() for author in draft.authors]
|
draft_dict["authors"] = [author.dict() for author in draft.authors]
|
||||||
|
|
||||||
|
# Добавляем информацию о публикации, если она есть
|
||||||
|
if draft.publication:
|
||||||
|
draft_dict["publication"] = {
|
||||||
|
"id": draft.publication.id,
|
||||||
|
"slug": draft.publication.slug,
|
||||||
|
"published_at": draft.publication.published_at
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
draft_dict["publication"] = None
|
||||||
|
|
||||||
drafts_data.append(draft_dict)
|
drafts_data.append(draft_dict)
|
||||||
|
|
||||||
return {"drafts": drafts_data}
|
return {"drafts": drafts_data}
|
||||||
|
|
|
@ -107,6 +107,12 @@ type Shout {
|
||||||
score: Float
|
score: Float
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PublicationInfo {
|
||||||
|
id: Int!
|
||||||
|
slug: String!
|
||||||
|
published_at: Int
|
||||||
|
}
|
||||||
|
|
||||||
type Draft {
|
type Draft {
|
||||||
id: Int!
|
id: Int!
|
||||||
created_at: Int!
|
created_at: Int!
|
||||||
|
@ -129,9 +135,9 @@ type Draft {
|
||||||
deleted_at: Int
|
deleted_at: Int
|
||||||
updated_by: Author
|
updated_by: Author
|
||||||
deleted_by: Author
|
deleted_by: Author
|
||||||
authors: [Author]
|
authors: [Author]!
|
||||||
topics: [Topic]
|
topics: [Topic]!
|
||||||
|
publication: PublicationInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type Stat {
|
type Stat {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user