mirror of
https://github.com/StepanovPlaton/torrent_backend.git
synced 2026-04-03 20:30:38 +04:00
Update database architecture. Add genres and actors
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
from time import strftime
|
from time import strftime
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.future import select
|
from sqlalchemy.future import select
|
||||||
|
from sqlalchemy.orm import selectinload
|
||||||
|
|
||||||
from .. import models as mdl
|
from .. import models as mdl
|
||||||
from .. import schemas as sch
|
from .. import schemas as sch
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
from .games import Game as Game
|
from .games import Game as Game
|
||||||
|
from .game_genres import GameGenre as GameGenre
|
||||||
|
|
||||||
from .movies import Movie as Movie
|
from .movies import Movie as Movie
|
||||||
|
from .movie_genres import MovieGenre as MovieGenre
|
||||||
|
from .movie_actors import MovieActor as MovieActor
|
||||||
|
|
||||||
from .audiobooks import Audiobook as Audiobook
|
from .audiobooks import Audiobook as Audiobook
|
||||||
|
from .audiobook_genres import AudiobookGenre as AudiobookGenre
|
||||||
|
|
||||||
from .users import User as User
|
from .users import User as User
|
||||||
|
|||||||
25
database/models/audiobook_genres.py
Normal file
25
database/models/audiobook_genres.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
|
from ..database import Base
|
||||||
|
|
||||||
|
|
||||||
|
class AudiobookGenre(Base):
|
||||||
|
__tablename__ = "audiobook_genres"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
genre = Column(String, nullable=False, unique=True)
|
||||||
|
|
||||||
|
audiobooks = relationship("Audiobook", secondary="audiobook_to_genre",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
|
class AudiobookToGenre(Base):
|
||||||
|
__tablename__ = "audiobook_to_genre"
|
||||||
|
__table_args__ = (
|
||||||
|
PrimaryKeyConstraint("audiobook_id", "genre_id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
audiobook_id = Column(Integer, ForeignKey("audiobooks.id"), nullable=False)
|
||||||
|
genre_id = Column(Integer, ForeignKey(
|
||||||
|
"audiobook_genres.id"), nullable=False)
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from sqlalchemy import Column, ForeignKey, Integer, String
|
from sqlalchemy import Column, ForeignKey, Integer, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from ..database import Base
|
from ..database import Base
|
||||||
|
|
||||||
@@ -14,7 +15,6 @@ class Audiobook(Base):
|
|||||||
author = Column(String)
|
author = Column(String)
|
||||||
|
|
||||||
torrent_file = Column(String, nullable=False)
|
torrent_file = Column(String, nullable=False)
|
||||||
upload_date = Column(String, nullable=False)
|
|
||||||
fragment = Column(String)
|
fragment = Column(String)
|
||||||
update_date = Column(String, nullable=False)
|
update_date = Column(String, nullable=False)
|
||||||
language = Column(String)
|
language = Column(String)
|
||||||
@@ -23,4 +23,7 @@ class Audiobook(Base):
|
|||||||
duration = Column(String)
|
duration = Column(String)
|
||||||
reader = Column(String)
|
reader = Column(String)
|
||||||
|
|
||||||
|
genres = relationship("AudiobookGenre", secondary="audiobook_to_genre",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
owner_id = Column(Integer, ForeignKey("users.id"))
|
owner_id = Column(Integer, ForeignKey("users.id"))
|
||||||
|
|||||||
24
database/models/game_genres.py
Normal file
24
database/models/game_genres.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
|
from ..database import Base
|
||||||
|
|
||||||
|
|
||||||
|
class GameGenre(Base):
|
||||||
|
__tablename__ = "game_genres"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
genre = Column(String, nullable=False, unique=True)
|
||||||
|
|
||||||
|
games = relationship("Game", secondary="game_to_genre",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
|
class GameToGenre(Base):
|
||||||
|
__tablename__ = "game_to_genre"
|
||||||
|
__table_args__ = (
|
||||||
|
PrimaryKeyConstraint("game_id", "genre_id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
game_id = Column(Integer, ForeignKey("games.id"), nullable=False)
|
||||||
|
genre_id = Column(Integer, ForeignKey("game_genres.id"), nullable=False)
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from sqlalchemy import Column, ForeignKey, Integer, String
|
from sqlalchemy import Column, ForeignKey, Integer, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from ..database import Base
|
from ..database import Base
|
||||||
|
|
||||||
@@ -11,7 +12,6 @@ class Game(Base):
|
|||||||
cover = Column(String)
|
cover = Column(String)
|
||||||
description = Column(String)
|
description = Column(String)
|
||||||
torrent_file = Column(String, nullable=False)
|
torrent_file = Column(String, nullable=False)
|
||||||
upload_date = Column(String, nullable=False)
|
|
||||||
trailer = Column(String)
|
trailer = Column(String)
|
||||||
|
|
||||||
system = Column(String)
|
system = Column(String)
|
||||||
@@ -27,4 +27,8 @@ class Game(Base):
|
|||||||
release_date = Column(String)
|
release_date = Column(String)
|
||||||
download_size = Column(String)
|
download_size = Column(String)
|
||||||
|
|
||||||
|
genres = relationship("GameGenre", secondary="game_to_genre",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
owner_id = Column(Integer, ForeignKey("users.id"))
|
owner_id = Column(Integer, ForeignKey("users.id"))
|
||||||
|
owner = relationship("User", lazy="selectin", viewonly=True)
|
||||||
|
|||||||
24
database/models/movie_actors.py
Normal file
24
database/models/movie_actors.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
|
from ..database import Base
|
||||||
|
|
||||||
|
|
||||||
|
class MovieActor(Base):
|
||||||
|
__tablename__ = "movie_actors"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
actor = Column(String, nullable=False, unique=True)
|
||||||
|
|
||||||
|
movies = relationship("Movies", secondary="movie_to_actor",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
|
class MovieToActor(Base):
|
||||||
|
__tablename__ = "movie_to_actor"
|
||||||
|
__table_args__ = (
|
||||||
|
PrimaryKeyConstraint("movie_id", "actor_id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
movie_id = Column(Integer, ForeignKey("movies.id"), nullable=False)
|
||||||
|
actor_id = Column(Integer, ForeignKey("movie_actors.id"), nullable=False)
|
||||||
24
database/models/movie_genres.py
Normal file
24
database/models/movie_genres.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
|
from ..database import Base
|
||||||
|
|
||||||
|
|
||||||
|
class MovieGenre(Base):
|
||||||
|
__tablename__ = "movie_genres"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
genre = Column(String, nullable=False, unique=True)
|
||||||
|
|
||||||
|
movies = relationship("Movies", secondary="movie_to_genre",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
|
class MovieToGenre(Base):
|
||||||
|
__tablename__ = "movie_to_genre"
|
||||||
|
__table_args__ = (
|
||||||
|
PrimaryKeyConstraint("movie_id", "genre_id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
movie_id = Column(Integer, ForeignKey("movies.id"), nullable=False)
|
||||||
|
genre_id = Column(Integer, ForeignKey("movie_genres.id"), nullable=False)
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from sqlalchemy import Column, ForeignKey, Integer, String
|
from sqlalchemy import Column, ForeignKey, Integer, String
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from ..database import Base
|
from ..database import Base
|
||||||
|
|
||||||
@@ -14,7 +15,6 @@ class Movie(Base):
|
|||||||
description = Column(String)
|
description = Column(String)
|
||||||
|
|
||||||
torrent_file = Column(String, nullable=False)
|
torrent_file = Column(String, nullable=False)
|
||||||
upload_date = Column(String, nullable=False)
|
|
||||||
trailer = Column(String)
|
trailer = Column(String)
|
||||||
update_date = Column(String, nullable=False)
|
update_date = Column(String, nullable=False)
|
||||||
language = Column(String)
|
language = Column(String)
|
||||||
@@ -25,4 +25,10 @@ class Movie(Base):
|
|||||||
duration = Column(String)
|
duration = Column(String)
|
||||||
country = Column(String)
|
country = Column(String)
|
||||||
|
|
||||||
|
genres = relationship("MovieGenre", secondary="movie_to_genre",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
|
actors = relationship("MovieActor", secondary="movie_to_actor",
|
||||||
|
lazy="selectin")
|
||||||
|
|
||||||
owner_id = Column(Integer, ForeignKey("users.id"))
|
owner_id = Column(Integer, ForeignKey("users.id"))
|
||||||
|
|||||||
@@ -11,3 +11,7 @@ class User(Base):
|
|||||||
email = Column(String, nullable=False, unique=True)
|
email = Column(String, nullable=False, unique=True)
|
||||||
name = Column(String, nullable=False)
|
name = Column(String, nullable=False)
|
||||||
hash_of_password = Column(String, nullable=False)
|
hash_of_password = Column(String, nullable=False)
|
||||||
|
|
||||||
|
games = relationship("Game", viewonly=True)
|
||||||
|
movies = relationship("Movie", viewonly=True)
|
||||||
|
audiobooks = relationship("Audiobook", viewonly=True)
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
from .games import *
|
from .games import *
|
||||||
|
from .game_genres import *
|
||||||
|
|
||||||
from .movies import *
|
from .movies import *
|
||||||
|
from .movie_genres import *
|
||||||
|
from .movie_actors import *
|
||||||
|
|
||||||
from .audiobooks import *
|
from .audiobooks import *
|
||||||
|
from .audiobook_genres import *
|
||||||
|
|
||||||
from .users import *
|
from .users import *
|
||||||
|
|||||||
15
database/schemas/audiobook_genres.py
Normal file
15
database/schemas/audiobook_genres.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
|
||||||
|
class AudiobookGenreBase(BaseModel):
|
||||||
|
genre: str = Field(default=None, examples=["Боевик"])
|
||||||
|
|
||||||
|
|
||||||
|
class AudiobookGenreCreate(AudiobookGenreBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class AudiobookGenre(AudiobookGenreBase):
|
||||||
|
id: int = Field(examples=[1])
|
||||||
|
|
||||||
|
model_config = ConfigDict(from_attributes=True)
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from pydantic import BaseModel, ConfigDict, Field
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
from .users import UserOpenData as User
|
||||||
|
from .audiobook_genres import AudiobookGenre
|
||||||
|
|
||||||
|
|
||||||
class AudiobookCardBase(BaseModel):
|
class AudiobookCardBase(BaseModel):
|
||||||
title: str = Field(examples=["Марсианин"])
|
title: str = Field(examples=["Марсианин"])
|
||||||
@@ -39,13 +42,15 @@ class AudiobookBase(AudiobookCardBase):
|
|||||||
|
|
||||||
|
|
||||||
class AudiobookCreate(AudiobookBase):
|
class AudiobookCreate(AudiobookBase):
|
||||||
pass
|
genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
|
||||||
|
|
||||||
|
|
||||||
class Audiobook(AudiobookBase):
|
class Audiobook(AudiobookBase):
|
||||||
id: int = Field(examples=[1])
|
id: int = Field(examples=[1])
|
||||||
update_date: str = Field(examples=["2024-06-14 12:00:00"])
|
update_date: str = Field(examples=["2024-06-14 12:00:00"])
|
||||||
upload_date: str = Field(examples=["2024-06-14 12:00:00"])
|
|
||||||
owner_id: int = Field(examples=[1])
|
genres: list[AudiobookGenre] = Field()
|
||||||
|
|
||||||
|
owner: User = Field()
|
||||||
|
|
||||||
model_config = ConfigDict(from_attributes=True)
|
model_config = ConfigDict(from_attributes=True)
|
||||||
|
|||||||
16
database/schemas/game_genres.py
Normal file
16
database/schemas/game_genres.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from typing import Optional
|
||||||
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
|
||||||
|
class GameGenreBase(BaseModel):
|
||||||
|
genre: str = Field(default=None, examples=["Стратегия"])
|
||||||
|
|
||||||
|
|
||||||
|
class GameGenreCreate(GameGenreBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class GameGenre(GameGenreBase):
|
||||||
|
id: int = Field(examples=[1])
|
||||||
|
|
||||||
|
model_config = ConfigDict(from_attributes=True)
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from pydantic import BaseModel, ConfigDict, Field
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
from .users import UserOpenData as User
|
||||||
|
from .game_genres import GameGenre
|
||||||
|
|
||||||
|
|
||||||
class GameCardBase(BaseModel):
|
class GameCardBase(BaseModel):
|
||||||
title: str = Field(examples=["DwarfFortress"])
|
title: str = Field(examples=["DwarfFortress"])
|
||||||
@@ -40,13 +43,15 @@ class GameBase(GameCardBase):
|
|||||||
|
|
||||||
|
|
||||||
class GameCreate(GameBase):
|
class GameCreate(GameBase):
|
||||||
pass
|
genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
|
||||||
|
|
||||||
|
|
||||||
class Game(GameBase):
|
class Game(GameBase):
|
||||||
id: int = Field(examples=[1])
|
id: int = Field(examples=[1])
|
||||||
update_date: str = Field(examples=["2024-05-13 12:00:00"])
|
update_date: str = Field(examples=["2024-05-13 12:00:00"])
|
||||||
upload_date: str = Field(examples=["2024-05-13 12:00:00"])
|
|
||||||
owner_id: int = Field(examples=[1])
|
genres: list[GameGenre] = Field()
|
||||||
|
|
||||||
|
owner: User = Field()
|
||||||
|
|
||||||
model_config = ConfigDict(from_attributes=True)
|
model_config = ConfigDict(from_attributes=True)
|
||||||
|
|||||||
15
database/schemas/movie_actors.py
Normal file
15
database/schemas/movie_actors.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
|
||||||
|
class MovieActorBase(BaseModel):
|
||||||
|
actor: str = Field(default=None, examples=["Мэттью Макконахи"])
|
||||||
|
|
||||||
|
|
||||||
|
class MovieActorCreate(MovieActorBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MovieActor(MovieActorBase):
|
||||||
|
id: int = Field(examples=[1])
|
||||||
|
|
||||||
|
model_config = ConfigDict(from_attributes=True)
|
||||||
15
database/schemas/movie_genres.py
Normal file
15
database/schemas/movie_genres.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
|
||||||
|
class MovieGenreBase(BaseModel):
|
||||||
|
genre: str = Field(default=None, examples=["Фантастика"])
|
||||||
|
|
||||||
|
|
||||||
|
class MovieGenreCreate(MovieGenreBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MovieGenre(MovieGenreBase):
|
||||||
|
id: int = Field(examples=[1])
|
||||||
|
|
||||||
|
model_config = ConfigDict(from_attributes=True)
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from pydantic import BaseModel, ConfigDict, Field
|
from pydantic import BaseModel, ConfigDict, Field
|
||||||
|
|
||||||
|
from .users import UserOpenData as User
|
||||||
|
from .movie_genres import MovieGenre
|
||||||
|
from .movie_actors import MovieActor
|
||||||
|
|
||||||
|
|
||||||
class MovieCardBase(BaseModel):
|
class MovieCardBase(BaseModel):
|
||||||
title: str = Field(examples=["Интерстеллар"])
|
title: str = Field(examples=["Интерстеллар"])
|
||||||
@@ -43,13 +47,17 @@ class MovieBase(MovieCardBase):
|
|||||||
|
|
||||||
|
|
||||||
class MovieCreate(MovieBase):
|
class MovieCreate(MovieBase):
|
||||||
pass
|
genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
|
||||||
|
actors: Optional[list[int]] = Field(default=None, examples=[[1, 2]])
|
||||||
|
|
||||||
|
|
||||||
class Movie(MovieBase):
|
class Movie(MovieBase):
|
||||||
id: int = Field(examples=[1])
|
id: int = Field(examples=[1])
|
||||||
update_date: str = Field(examples=["2024-06-11 12:00:00"])
|
update_date: str = Field(examples=["2024-06-11 12:00:00"])
|
||||||
upload_date: str = Field(examples=["2024-06-11 12:00:00"])
|
|
||||||
owner_id: int = Field(examples=[1])
|
genres: list[MovieGenre] = Field()
|
||||||
|
actors: list[MovieActor] = Field()
|
||||||
|
|
||||||
|
owner: User = Field()
|
||||||
|
|
||||||
model_config = ConfigDict(from_attributes=True)
|
model_config = ConfigDict(from_attributes=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user