Estoy tratando de crear un objeto Activty
para una lista grande (más de 300 a la vez) de objetos Inquiry
. Tengo un único ModelForm
que se está publicando, y necesito crear instancias separadas, y adjuntarlas a mi Inquiry
a través de GenericForeignKey
. Vamos a llegar a un cierto código:Crear entradas de bases de datos masivas de manera eficiente?
models.py:
class InquiryEntry(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
entry = generic.GenericForeignKey('content_type', 'object_id')
class Inquiry(models.Model):
entries = models.ManyToManyField('InquiryEntry')
# And many more fields.
def add_entry(self, obj):
entry = self.entries.create(entry=obj)
self.save()
return entry
class Activity(models.Model):
ts = models.DateTimeField(auto_now_add=True)
due_date = models.DateField(auto_now=False)
## And many more fields.
views.py:
def bulk_create_activities(request):
activity_form = ActivityForm()
if request.method == "POST":
activity_form = ActivityForm(request.POST)
if activity_form.is_valid():
pks = [int(x) for x in request.POST.get('pks', '').split(',')]
for inquiry in Inquiry.objects.filter(pk__in=pks):
instance = ActivityForm(request.POST).save()
inquiry.add_entry(instance)
inquiry.save()
Lo que estoy buscando es una manera de insertar estos en la base de datos , preferiblemente en una sola pasada para que la solicitud se pueda procesar más rápido. Prefiero no bajar al nivel de la base de datos ya que esta aplicación se implementa en múltiples proveedores de bases de datos, pero si esa es la única forma de proceder, que así sea (ejemplos para MySQL y Postgres serían increíbles).
Nota: Sé que hay un bulk_create
en la versión de desarrollo, pero que está fuera de la cuestión hasta que haya una versión estable.
Parece una buena idea, pero no cambió mucho el rendimiento. En 5-10 Actividades, tuvo un aumento de velocidad de aproximadamente 5%. En 100, una disminución del 10% de velocidad. –
Gracias por el puntero. Esta es una gran nueva característica. – AgDude