[Python] item_state = attributes.instance_state(item)

Discussão em 'Python' iniciado por Stack, Março 24, 2025.

  1. Stack

    Stack Membro Participativo

    here is my model.py
    from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Table
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, relationship
    from enum import Enum as PyEnum


    SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"


    engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base()

    class Gender(PyEnum):
    male = "male"
    female = "female"

    class Role(PyEnum):
    admin = "admin"
    student = "student"


    user_roles = Table(
    "user_roles",
    Base.metadata,
    Column("user_id", Integer, ForeignKey("users.id"), primary_key=True),
    Column("role_id", Integer, ForeignKey("roles.id"), primary_key=True),)

    class RoleTable(Base):
    __tablename__ = "roles"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, unique=True, nullable=False) # ✅ Store as a string instead of Enum

    # Many-to-Many relationship with User
    users = relationship("User", secondary=user_roles, back_populates="roles")

    class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    first_name = Column(String, nullable=False)
    middle_name = Column(String, nullable=True)
    last_name = Column(String, nullable=False)
    email = Column(String, unique=True, index=True, nullable=False)
    password = Column(String, nullable=False)
    gender = Column(String, nullable=False) # ✅ Store gender as a string
    roles = relationship("RoleTable", secondary=user_roles, back_populates="users") # ✅ Fix relationship


    Base.metadata.create_all(bind=engine)

    I received this error and i do not know what to do since am still learning backend with fastapi: File "C:\Users\flex zone\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 63, in append
    item_state = attributes.instance_state(item)


    AttributeError: 'str' object has no attribute '_sa_instance_state'

    here is my schema.py code from my project

    from pydantic import BaseModel, EmailStr
    from typing import List, Optional
    from enum import Enum

    class Gender(str, Enum):
    male = "male"
    female = "female"

    class Role(str, Enum):
    admin = "admin"
    student = "student"



    class UserBase(BaseModel):
    first_name: str
    middle_name: Optional[str] = None
    last_name: str
    email: EmailStr
    password: str
    gender: Gender
    roles: List[str] # ✅ Expect List of role names (not RoleTable)


    class Config:
    orm_mode = True

    class UserResponse(UserBase):
    id: int


    class UserCreate(UserBase):
    pass


    route.py

    from fastapi import APIRouter, Depends, HTTPException
    from sqlalchemy.orm import Session
    from database import SessionLocal
    from models.user_model import User, RoleTable
    from schemas.user_schema import UserCreate, UserResponse
    from typing import List


    router = APIRouter()
    def get_db():
    db = SessionLocal()
    try:
    yield db
    finally:
    db.close()

    router.post("/", response_model=UserResponse)
    def create_user(user: UserCreate, db: Session = Depends(get_db)):
    # Check if email already exists
    existing_user = db.query(User).filter(User.email == user.email).first()
    if existing_user:
    raise HTTPException(status_code=400, detail="Email already registered")

    # ✅ Convert role names (strings) into RoleTable instances
    role_objects = db.query(RoleTable).filter(RoleTable.name.in_(user.roles)).all()

    if len(role_objects) != len(user.roles): # Make sure all roles are valid
    raise HTTPException(status_code=400, detail="One or more invalid roles provided")

    # ✅ Create user object and assign roles (as RoleTable instances)
    new_user = User(
    first_name=user.first_name,
    middle_name=user.middle_name,
    last_name=user.last_name,
    email=user.email,
    password=user.password, # Hash this in real apps
    gender=user.gender,
    roles=role_objects # Store as RoleTable objects
    )

    # ✅ Save to database
    db.add(new_user)
    db.commit()
    db.refresh(new_user)

    # ✅ Convert RoleTable objects to strings for response
    new_user_roles = [role.name for role in new_user.roles] # Just use role.name as it's already a string

    # Manually update the roles before returning
    new_user.roles = new_user_roles

    return new_user


    am working with PyCharm and am i a young developer still learning i received error when try to create a new post from the browser

    Continue reading...

Compartilhe esta Página