Many to many relationship between user and announcement tables implemented, book endpoint changed accordingly

This commit is contained in:
2024-08-13 15:48:13 +03:00
parent c0229d6727
commit af9aa243bf
5 changed files with 121 additions and 19 deletions

View File

@ -1,6 +1,7 @@
from sqlalchemy import Column, Integer, String, Boolean, Float, Date, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, Boolean, Float, Date, ForeignKey, ForeignKeyConstraint
from sqlalchemy.orm import relationship, mapped_column, composite, Mapped
from sqlalchemy.dialects import postgresql
import dataclasses
from .db import Base, engine
@ -18,7 +19,7 @@ class User(Base):#класс пользователя
num_of_ratings = Column(Integer, default=0) # количество оценок (т.е. то, сколько раз другие пользователи оценили текущего)
reg_date = Column(Date) # дата регистрации
announcements = relationship("Announcement", back_populates="user", lazy='selectin')
announcements = relationship("Announcement", secondary="announcementuser", back_populates="user", lazy='selectin')
trashboxes_chosen = relationship("Trashbox", back_populates="user", lazy='selectin')
class Announcement(Base): #класс объявления
@ -36,11 +37,35 @@ class Announcement(Base): #класс объявления
src = Column(String, nullable=True) #изображение продукта в объявлении
metro = Column(String) #ближайщее метро от адреса нахождения продукта
trashId = Column(Integer, nullable=True)
booked_by = postgresql.ARRAY(Integer, dimensions=2) #массив с id пользователей, забронировавших объявление
booked_counter = Column(Integer) #количество забронировавших (0 - никто не забронировал)
booked_by = Column(Integer, nullable=True) # id пользователя, забронировавшего объявление
booked_counter = Column(Integer, nullable=True) #количество забронировавших (0 - никто не забронировал)
obsolete = Column(Boolean, default=False) # состояние объявления (по-умолчанию считаем его актуальным)
user = relationship("User", back_populates="announcements")
user = relationship("User", secondary="announcementuser", back_populates="announcements")
# Класс пары, хранящей id объявления и id забронировавшего юзера
@dataclasses.dataclass
class UserAnouncementPair:
announcement_id: int
booking_user_id: int
class AnnouncementUser(Base):
__tablename__ = "announcementuser"
def __init__(self, an_id, b_u_id):
self.announcement_id = an_id
self.booking_user_id = b_u_id
announcement_id = Column(Integer, ForeignKey("announcements.id"), primary_key=True) # id забронированного объявления
booking_user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) # id пользователя, забронировавшего объявление
# class Ratings(Base):
# __tablename__ = "ratings"
# rated_user_id = Column(Integer, primary_key=True) # id пользователя, оставившего оценку
# rating_value = Column(Integer, primary_key=True) # оценка
class Trashbox(Base): #класс мусорных баков