Gostaria de atualizar uma tabela com o Django - algo parecido com isto em SQL bruto:
update tbl_name set name = 'foo' where name = 'bar'
Meu primeiro resultado é algo assim - mas isso é desagradável, não é?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Existe uma maneira mais elegante?
django
django-models
Thomas Schwärzl
fonte
fonte
ModelClass
abordagem? Em seguida, alimente o Django como: stackoverflow.com/questions/16853649/…Respostas:
Atualizar:
A versão do Django 2.2 agora tem um bulk_update .
Resposta antiga:
Consulte a seguinte seção de documentação do django
Em suma, você deve ser capaz de usar:
Você também pode usar
F
objetos para fazer coisas como incrementar linhas:Veja a documentação .
No entanto, observe que:
ModelClass.save
método (portanto, se você tiver alguma lógica, ela não será acionada)..update()
QuerySet fatiado, ele deve estar em um QuerySet original, portanto, você precisará se apoiar nos métodos.filter()
e.exclude()
.fonte
save()
, osDateTimeField
campos comauto_now=True
(colunas "modificadas") não serão atualizados.ModelClass.objects.filter(name = 'bar').update(name="foo")
não cumpre o objetivo da atualização em massa, se eu tiver dados diferentes para diferentes IDs, como eu poderia fazer isso sem usar o loop?Entry.objects.all().update(title=F('blog__title'))
. Os documentos têm uma pequena menção a isso. Se você quiser extrair dados de um outro modelo para atualizar suas entradas, você terá que executar um loopConsidere o uso
django-bulk-update
encontrado aqui no GitHub .Instalar:
pip install django-bulk-update
Implementar: (código extraído diretamente do arquivo Leiame dos projetos)
Atualização: Como Marc aponta nos comentários, isso não é adequado para atualizar milhares de linhas de uma só vez. Embora seja adequado para lotes menores de 10 a 100. O tamanho do lote certo para você depende da CPU e da complexidade da consulta. Essa ferramenta é mais um carrinho de mão do que um caminhão de lixo.
fonte
A versão do Django 2.2 agora possui um
bulk_update
método ( notas de versão ).https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-update
Exemplo:
fonte
Se você deseja definir o mesmo valor em uma coleção de linhas , pode usar o método update () combinado com qualquer termo de consulta para atualizar todas as linhas em uma consulta:
Se você deseja atualizar uma coleção de linhas com valores diferentes, dependendo de alguma condição, na melhor das hipóteses, é possível agrupar as atualizações de acordo com os valores. Digamos que você tenha 1000 linhas nas quais deseja definir uma coluna com um dos valores X, então você pode preparar os lotes antecipadamente e executar apenas X consultas de atualização (cada uma essencialmente com a forma do primeiro exemplo acima) + o SELECT inicial -inquerir.
Se todas as linhas exigirem um valor exclusivo, não há como evitar uma consulta por atualização. Talvez procure outras arquiteturas como CQRS / Event sourcing, se precisar de desempenho neste último caso.
fonte
Você pode consultar este link para obter mais informações sobre atualização e criação em massa. Atualização em massa e Criar
fonte