Exclua vários objetos no Django


104

Eu preciso selecionar vários objetos a serem excluídos do meu banco de dados no django usando uma página da web. Não há categoria para selecionar, então não posso excluir de todas elas assim. Tenho que implementar meu próprio formulário de exclusão e processá-lo no Django ou o Django já tem uma maneira de fazer isso? Conforme implementado na interface de administração.

Respostas:


200

Você pode excluir qualquer QuerySet que desejar. Por exemplo, para excluir todas as postagens do blog com algum modelo de postagem

Post.objects.all().delete()

e excluir qualquer Postagem com uma data de publicação futura

Post.objects.filter(pub_date__gt=datetime.now()).delete()

No entanto, você precisa encontrar uma maneira de restringir seu QuerySet. Se você deseja apenas que uma visão exclua um objeto específico, examine a visão genérica de exclusão .

EDITAR:

Desculpe pelo mal entendido. Acho que a resposta está entre as duas. Para implementar o seu próprio, combinam ModelForms e views genéricas . Caso contrário, procure aplicativos de terceiros que fornecem funcionalidade semelhante. Em uma questão relacionada , a recomendação foi django-filter .


1
Não, você entendeu mal a pergunta. Eu entendo que posso deletar tudo. Mas preciso selecionar os objetos a serem excluídos com um formulário em uma página da web. E, em seguida, processar os dados retornados do formulário em meu views.py. Em seguida, faça um loop pelo que é retornado no formulário, excluindo como seu loop pelos dados. Mas eu queria saber qual é a melhor prática para implementar isso no Django.
Dean

Ah, erro meu! Eu usaria um aplicativo de terceiros ou visualizações genéricas com ModelForms.
Matt Luongo

7
@Dean, dê uma olhada na visualização de exclusão. Ou você pode simplesmente escrever sua própria visão ... Quero dizer, no final das contas, você provavelmente está recebendo uma lista de PKs e chamando delete no seu modelo ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()e tenho certeza que quer algo para garantir que uma pessoa aleatória não possa excluir todos objetos em seu banco de dados adivinhando PKs.
Yuji 'Tomita' Tomita

1
@Dean, é difícil responder à sua pergunta sem entender mais sobre ela. Você só precisa construir um formulário que permite ao usuário selecionar os critérios de exclusão corretos (sejam quais forem - talvez até mesmo uma caixa de entrada onde se digita um número de ID ... mas provavelmente mais complexo), construir uma visão que responda a isso formulário, talvez execute validação (permissões) e, finalmente, execute esse filter(foo).delete()método.
Yuji 'Tomita' Tomita

1
Uma das razões pelas quais isso não vem com o framework é a questão da autorização para edições / exclusões e outras complexidades mencionadas por @YujiTomita. Se você realmente precisa de filtragem complexa, verifique django-filtering e adicione um botão de exclusão que chama QuerySet.delete () se o usuário estiver autorizado.
Matt Luongo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.