una - A granel crear objetos modelo en django
modelos en django (8)
A continuación se detalla cómo crear entidades de forma masiva a partir de archivos separados por columnas, dejando de lado todas las rutinas sin comillas y sin escalas:
SomeModel(Model):
@classmethod
def from_file(model, file_obj, headers, delimiter):
model.objects.bulk_create([
model(**dict(zip(headers, line.split(delimiter))))
for line in file_obj],
batch_size=None)
Tengo muchos objetos para guardar en la base de datos, por lo que quiero crear instancias de modelo con eso.
Con django, puedo crear todas las instancias de modelos, con MyModel(data)
y luego quiero guardarlos todos.
Actualmente, tengo algo así:
for item in items:
object = MyModel(name=item.name)
object.save()
Me pregunto si puedo guardar una lista de objetos directamente, por ejemplo:
objects = []
for item in items:
objects.append(MyModel(name=item.name))
objects.save_all()
¿Cómo guardar todos los objetos en una transacción?
La forma más fácil es usar el método create
Manager, que crea y guarda el objeto en un solo paso.
for item in items:
MyModel.objects.create(name=item.name)
Mira esta publicación de blog en el módulo de bulkops .
En mi aplicación django 1.3, he experimentado una aceleración significativa.
Usar create causará una consulta por cada nuevo elemento. Si desea reducir el número de consultas INSERT, necesitará usar algo más.
Tuve cierto éxito al usar el fragmento Bulk Insert, aunque el fragmento es bastante antiguo. Quizás haya algunos cambios necesarios para que funcione nuevamente.
Use el método bulk_create (). Ahora es estándar en Django: Documentación oficial de Django bulk_create ()
Ejemplo:
>>> Entry.objects.bulk_create([
... Entry(headline="Django 1.0 Released"),
... Entry(headline="Django 1.1 Announced"),
... Entry(headline="Breaking: Django is awesome")
... ])
a partir de la versión de desarrollo django 1.4, existe bulk_create
como método de gestión de objetos que toma como entrada una matriz de objetos creados utilizando el constructor de clase. echa un vistazo a los documentos de django
para una implementación de una sola línea, puede usar una expresión lambda en un mapa
map(lambda x:MyModel.objects.get_or_create(name=x), items)
Aquí, lambda compara cada elemento de la lista de elementos con x y crea un registro de la base de datos si es necesario.
trabajé para mí para usar el manejo manual de transacciones para el ciclo (postgres 9.1):
from django.db import transaction
with transaction.commit_on_success():
for item in items:
MyModel.objects.create(name=item.name)
de hecho, no es lo mismo, como la inserción masiva de la base de datos "nativa", pero le permite evitar / desanimar las operaciones de transporte / orms / consultas sql.