Me gustaría actualizar una tabla con Django, algo así en SQL sin formato:
update tbl_name set name = 'foo' where name = 'bar'
Mi primer resultado es algo como esto, pero eso es desagradable, ¿no?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
¿Hay alguna forma más elegante?
django
django-models
Thomas Schwärzl
fuente
fuente
ModelClass
enfoque? Luego alimente a Django como: stackoverflow.com/questions/16853649/…Respuestas:
Actualizar:
La versión 2.2 de Django ahora tiene una actualización masiva .
Vieja respuesta:
Consulte la siguiente sección de documentación de django
En resumen, deberías poder usar:
También puede usar
F
objetos para hacer cosas como incrementar filas:Ver la documentación .
Sin embargo, tenga en cuenta que:
ModelClass.save
método (por lo tanto, si tiene algo de lógica dentro, no se activará)..update()
QuerySet en rodajas, debe estar en un QuerySet original, por lo que deberá apoyarse en los métodos.filter()
y.exclude()
.fuente
save()
, losDateTimeField
campos conauto_now=True
(columnas "modificadas") no se actualizarán.ModelClass.objects.filter(name = 'bar').update(name="foo")
no cumple el propósito de la actualización masiva, si tengo datos diferentes para diferentes identificadores, ¿cómo podría hacerlo sin usar el bucle?Entry.objects.all().update(title=F('blog__title'))
. Los doctores tienen una pequeña mención de esto. Si desea obtener datos de otro modelo para actualizar sus entradas, deberá ejecutar un bucle forConsidere usar
django-bulk-update
encontrado aquí en GitHub .Instalar en pc:
pip install django-bulk-update
Implementar: (código tomado directamente del archivo Léame de proyectos)
Actualización: como Marc señala en los comentarios, esto no es adecuado para actualizar miles de filas a la vez. Aunque es adecuado para lotes más pequeños de 10 a 100. El tamaño del lote adecuado para usted depende de su CPU y la complejidad de la consulta. Esta herramienta se parece más a una carretilla que a un camión volquete.
fuente
La versión 2.2 de Django ahora tiene un
bulk_update
método ( notas de la versión ).https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-update
Ejemplo:
fuente
Si desea establecer el mismo valor en una colección de filas , puede usar el método update () combinado con cualquier término de consulta para actualizar todas las filas en una consulta:
Si desea actualizar una colección de filas con diferentes valores dependiendo de alguna condición, en el mejor de los casos puede agrupar las actualizaciones según los valores. Digamos que tiene 1000 filas en las que desea establecer una columna en uno de los valores X, luego puede preparar los lotes de antemano y luego solo ejecutar X consultas de actualización (cada una esencialmente con la forma del primer ejemplo anterior) + el SELECT inicial -consulta.
Si cada fila requiere un valor único, no hay forma de evitar una consulta por actualización. Tal vez busque otras arquitecturas como CQRS / fuente de eventos si necesita rendimiento en este último caso.
fuente
Puede consultar este enlace para obtener más información sobre la actualización y creación masiva. Actualización masiva y Crear
fuente