Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

980
Views
fastapi + sqlalchemy + pydantic → cómo procesar relaciones de muchos a muchos

Tengo editor y article . Muchos editores pueden estar relacionados con muchos artículos y muchos artículos pueden tener muchos editores al mismo tiempo.

Mis tablas DB son

  • Artículo
identificación tema texto
1 Vacaciones de Año Nuevo En este año... etc etc etc
  • Editor
identificación nombre Email
1 John Smith algunos@correo electrónico
  • EditorArtículoRelación
editor_id ID del artículo
1 1

mis modelos son

 from sqlalchemy import Boolean, Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from database import Base class Editor(Base): __tablename__ = "editor" id = Column(Integer, primary_key=True, index=True) name = Column(String(32), unique=False, index=False, nullable=True) email = Column(String(115), unique=True, index=True) articles = relationship("Article", secondary=EditorArticleRelation, back_populates="articles", cascade="all, delete") class Article(Base): __tablename__ = "article" id = Column(Integer, primary_key=True, index=True) subject = Column(String(32), unique=True, index=False) text = Column(String(256), unique=True, index=True, nullable=True) editors = relationship("Editor", secondary=EditorArticleRelation, back_populates="editors", cascade="all, delete") EditorArticleRelation = Table('editorarticlerelation', Base.metadata, Column('editor_id', Integer, ForeignKey('editor.id')), Column('article_id', Integer, ForeignKey('article.id')) )

mis esquemas son

 from typing import Optional, List from pydantic import BaseModel class EditorBase(BaseModel): name: Optional[str] email: str class EditorCreate(EditorBase): pass class Editor(EditorBase): id: int class Config: orm_mode = True class ArticleBase(BaseModel): subject: str text: str class ArticleCreate(ArticleBase): # WHAT I NEED TO SET HERE??? editor_ids: List[int] = [] class Article(ArticleBase): id: int editors: List[Editor] = [] class Config: orm_mode = True

mi basura

 def create_article(db: Session, article_data: schema.ArticleCreate): db_article = model.Article(subject=article_data.subject, text=article_data.text, ??? HOW TO SET EDITORS HERE ???) db.add(db_article) db.commit() db.refresh(db_article) return db_article

mi ruta

 @app.post("/articles/", response_model=schema.Article) def create_article(article_data: schema.ArticleCreate, db: Session = Depends(get_db)): db_article = crud.get_article_by_name(db, name=article_data.name) if db_article: raise HTTPException(status_code=400, detail="article already registered") if len(getattr(article_data, 'editor_ids', [])) > 0: ??? WHAT I NEED TO SET HERE??? return crud.create_article(db=db, article_data=article_data)

lo que quiero →

Quiero publicar datos para la API de creación de artículos y resolver y agregar automáticamente relaciones de editor, o generar un error si alguno de los editores no existe:

 { "subject": "Fresh news" "text": "Today is ..." "editor_ids": [1, 2, ...] }

Las preguntas son:

  1. ¿Cómo configurar correctamente las operaciones crud ( HOW TO SET EDITORS HERE )?
  2. ¿Cómo configurar correctamente crear/leer esquemas y campos de relación (especialmente WHAT I NEED TO SET HERE )?
  3. ¿Cómo configurar correctamente el código de ruta (especialmente WHAT I NEED TO SET HERE )?
  4. Si aquí no es posible resolver las relaciones automáticamente, ¿qué lugar será mejor para resolver las relaciones (comprobar si existe un editor, etc.)? ruta o crud?
  5. ¿Quizás mi camino es malo en absoluto? Si conoce algún ejemplo de cómo manejar relaciones de muchos a muchos con pydantic y sqlalchemy , cualquier información será bienvenida.
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

No estoy seguro si mi solución es más efectiva, pero lo hice de esta manera:

  • ruta (igual que en la pregunta):
 ... @app.post("/articles/", response_model=schema.Article) def create_article(article_data: schema.ArticleCreate, db: Session = Depends(get_db)): db_article = crud.get_article_by_name(db, name=article_data.name) if db_article: raise HTTPException(status_code=400, detail="article already registered") return crud.create_article(db=db, article_data=article_data) ...
  • esquema (igual que en la pregunta):
 ... class ArticleCreate(ArticleBase): editor_ids: List[int] = [] ...
  • crud (la solución está aquí ):
 def create_article(db: Session, article_data: schema.ArticleCreate): db_article = model.Article(subject=article_data.subject, text=article_data.text) if (editors := db.query(model.Editor).filter(model.Editor.id.in_(article_data.editor_ids))).count() == len(endpoint_data.topic_ids): db_article.topics.extend(editors) else: # even if at least one editor is not found, an error is raised # if existence is not matter you can skip this check and add relations only for existing data raise HTTPException(status_code=404, detail="editor not found") db.add(db_article) db.commit() db.refresh(db_article) return db_article

Cualquier idea mejor es bienvenida

over 4 years ago · Santiago Trujillo Report

0

Una solución que encontré.

 def create_user_groups(db: Session, user_groups: schemas.UserGroupsBase): db_user = db.query(models.User).filter(models.User.id == user_groups.id_user).first() db_group = db.query(models.Group).filter(models.Group.id == user_groups.id_group).first() if not db_user and db_group: raise HTTPException(status_code=409, detail="User or Group not found in system.") db_user.groups.append(db_group) db.add(db_user) db.commit() db.refresh(db_user) return db_user
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!