Como eu posso facilmente marcar registros como excluído em modelos de Django em vez de realmente excluí-los?

votos
12

Em vez de excluir registros na minha aplicação Django, quero apenas marcá-los como excluído e tê-los escondido de meus consultas ativas. O principal motivo para fazer isso é dar ao usuário a opção undelete no caso de eles acidentalmente excluir um registro (esses registros também podem ser necessários para determinada rastreamento de auditoria backend).

Há uma série de relações de chave estrangeira, então quando eu marcar um registro como excluído eu teria que Cascade este eliminar bandeira para esses registros também. Que ferramentas, projetos existentes, ou métodos que eu deveria usar para fazer isso?

Publicado 13/04/2009 em 15:34
fonte usuário
Em outras línguas...                            


5 respostas

votos
11

Django oferece fora da caixa o mecanismo exato que você está procurando.

Você pode alterar o gerente que é utilizada para acesso através de objetos relacionados. Se você novo gerente de filtros personalizados do objeto em um campo booleano, o objeto sinalizado inativo não vai aparecer em seus pedidos.

Veja aqui para mais detalhes: http://docs.djangoproject.com/en/dev/topics/db/managers/#using-managers-for-related-object-access

Respondeu 29/05/2009 em 08:42
fonte usuário

votos
4

Agradável pergunta, eu estive pensando como fazer eficientemente isso mesmo.

Não tenho certeza se isso vai fazer o truque, mas django-reversão parece fazer o que quiser, embora você provavelmente vai querer examinar para ver como ele atinge esse objetivo, uma vez que existem algumas formas ineficientes de fazê-lo.

Outro pensamento seria ter a bandeira boolean temido em seus modelos e, em seguida, criar um gerenciador customizado que adiciona automaticamente o filtro, embora isso não iria funcionar para pesquisas em diferentes modelos. No entanto, outra solução sugerida aqui é ter modelos duplicadas de tudo, o que parece ser um exagero, mas pode funcionar para você. Os comentários também discutir as diferentes opções.

Vou acrescentar que para a maior parte eu não considero qualquer uma destas soluções vale o aborrecimento; Eu normalmente apenas chupa-lo e filtrar minhas pesquisas na bandeira boolean. Ele evita muitos problemas que podem surgir se você tentar obter demasiado inteligente. É uma dor e não muito seco, é claro. A solução razoável seria uma mistura do gestor personalizado embora ciente de suas limitações se você tentar procurar um modelo relacionado com ele.

Respondeu 13/04/2009 em 15:38
fonte usuário

votos
3

Aqui está uma rápida blogue tutorial de Greg Allard a partir de um par de anos atrás, mas eu implementei usando Django 1.3 e foi ótimo. Eu adicionei métodos para meus objetos nomeados soft_delete, undelete, e hard_delete, que estabeleceu self.deleted = True, self.deleted = False, e voltou self.delete (), respectivamente.

A Gerente de Django modelo para soft excluir registros e como personalizar o Django admin

Respondeu 05/01/2012 em 19:39
fonte usuário

votos
3

Eu acho que usando um sinalizador booleano 'is_active' é bom - você não precisa cascata a bandeira de entradas relacionadas ao nível db, você só precisa manter referindo-se à situação do pai. Isto é o que acontece com o modelo do Usuário contrib.auth, lembre-se - marcando um usuário como não is_active não prompt de Django que passar por modelos relacionados e magicamente tentar desativar registros, em vez você apenas manter a verificação do atributo is_active do usuário correspondente ao item relacionado.

Por exemplo, se cada usuário tem muitos favoritos, e você não quer bookmarks de um usuário inativo para ser visível, apenas garantir que bookmark.user.is_active é verdade. Há pouco provável que seja uma necessidade de uma bandeira is_active no próprio marcador.

Respondeu 14/04/2009 em 00:48
fonte usuário

votos
0

Existem vários pacotes que fornecem essa funcionalidade: https://www.djangopackages.com/grids/g/deletion/

Estou desenvolvendo um https://github.com/meteozond/django-permanent/ Ele substitui Gestor padrão e QuerySet excluir métodos para trazer exclusão lógica. É padrão completamente sombras Django excluir métodos com uma exceção - modelos de marcas que são herdados de PermanentModel em vez de exclusão, mesmo que a sua exclusão causada por relação.

Respondeu 03/02/2014 em 10:06
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more