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!
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]