It is the first time I ask here as I am new. But I have spent two days with chatgpt and coudnt solve the problem.
When I want to do a POST I receive the following issue message.
{
“error”: “‘dict’ object has no attribute ‘_sa_instance_state'”
}
I want to create table named “event”, another one named “music_type” and create a relationship between them. However, every time I run my POST (create event function) I receive the error message.
# **MODELS/Events**
from typing import List
from config.database import Base
from sqlalchemy import Column, Integer, String, Float, Enum, Date, Table, ForeignKey
from sqlalchemy.orm import relationship, Mapped, mapped_column, DeclarativeBase
from enum import Enum as PydanticEnum
from models.music_type import MusicType
class PriceType(PydanticEnum):
FREE = "FREE"
ADMISSION = "ADMISSION"
CONSUMPTION = "CONSUMPTION"
# Tabla de relación many-to-many entre Event y MusicType
event_music_types = Table(
"event_music_types",
Base.metadata,
Column("event_id", Integer, ForeignKey("events.id")),
Column("music_type_id", Integer, ForeignKey("music_types.id"))
)
class Event (Base):
__tablename__ = "events"
id = Column (Integer, primary_key = True)
title = Column (String)
description = Column (String)
date = Column (Date)
place = Column (String)
street = Column (String)
city = Column (String)
organizer = Column (String)
price_type = Column (Enum(PriceType))
price_amount = Column (Float)
music_types = relationship("MusicType", secondary="event_music_types", backref="events", lazy="joined")
# **MODELS/Music_Type**
from config.database import Base
from sqlalchemy import Column, Integer, String
class MusicType(Base):
__tablename__ = "music_types"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
##**MY FUNCTION CODE SERVICES/event.py**
from models.event import Event as EventModel
from models.music_type import MusicType as MusicTypeModel
from schemas.event import Event
from schemas.music_type import MusicType
from sqlalchemy import or_
from typing import List
class EventService():
def __init__(self, db) -> None:
self.db = db
def get_events(self):
result = self.db.query(EventModel).all()
return result
def create_event(self, event: Event):
new_event = EventModel(**event.model_dump())
music_types = []
# Iterar sobre los tipos de música proporcionados en la solicitud JSON
for music_type_data in event.music_types:
music_type = self.db.query(MusicTypeModel).filter(MusicTypeModel.name == music_type_data.name).first()
if music_type:
music_types.append(music_type)
else:
# Si el tipo de música no existe, manejar el caso aquí
new_music_type = MusicTypeModel(name=music_type_data.name)
self.db.add(new_music_type)
self.db.commit()
music_types.append(new_music_type)
# Agregar el evento a la base de datos y realizar la confirmación
new_event.music_types.extend(music_types)
self.db.add(new_event)
self.db.commit()
self.db.refresh(new_event)
return
# **MY ROUTER CODE**
#
@event_router.post('/events', tags=['events'], response_model=dict, status_code=201)
def create_event( event: Event ) -> dict:
db = Session()
# Agrega el print aquí para verificar los datos de event.music_types
print(event.music_types)
EventService(db).create_event(event)
return JSONResponse(status_code=201, content={"message": "Se ha registrado el evento"})
Marco Antonio Murgueitio Bland is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.