Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

364
Vistas
Convertir ManyToMany en ForeignKey (django)

Tengo un campo ManyToMany en mi base de datos que quiero convertir a una relación ForeignKey. Las relaciones ya son de uno a muchos, por lo que no habrá encasillamiento.

La pregunta más cercana que puedo encontrar en stackoverflow es esta situación más complicada en un marco/idioma diferente

Mis modelos Django simplificados se muestran a continuación. Los campos en cuestión ya existen en la base de datos y solo necesitamos completar el campo DbLocation.pattern.

 class DbPattern(models.Model): locations = models.ManyToMany(DbLocation) #trying to remove this ... class DbLocation(models.Model) pattern = models.ForeignKey(DbPattern) #and replace it with this ...

Mi solución ingenua es un bucle for anidado. Funciona, pero parece que llevará días manejar varios millones de registros:

 patterns = DbPattern.objects.all() for p in patterns: locs = p.locations # there ary many locations for l in locs: l.pattern = p # each location has exactly 1 pattern.

¿Hay una manera fácil de implementar esto en Python/Django o PostreSQL que funcione rápido? Me imagino que hay una manera de hacer esto a través de consultas. Solo necesito hacerlo una vez.

¡Gracias de antemano por tu ayuda!

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Me las arreglé para acelerar varios órdenes de magnitud con algunos ajustes simples. Probablemente se podría lograr una mayor aceleración, pero esto es suficiente para mis propósitos.

Código ingenuo (1000 muestras toman 793 segundos)

 patterns = DbPattern.objects.all() for p in patterns: locs = p.locations # there ary many locations for l in locs: l.pattern = p # each location has exactly 1 pattern. l.save()

Primera mejora (1000 muestras tardan 11 segundos)

 patterns = DbPattern.objects.all() for p in patterns: locs = p.locations locs.update(pattern=p)

Segunda mejora (1000 muestras tardan 2,5 segundos)

 patterns = DbPattern.objects.all() [p.locations.all().update(pattern=pattern) for p in patterns]
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda