Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

329
Visualizações
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!

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

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]
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda