variable template language for examples django

language - django template variable



Anulando QuerySet.delete() en Django (2)

enfoque mixto

https://gist.github.com/dnozay/373571d8a276e6b2af1a

usa una receta similar a la de @manji publicada,

class DeactivateQuerySet(models.query.QuerySet): '''''' QuerySet whose delete() does not delete items, but instead marks the rows as not active, and updates the timestamps '''''' def delete(self): self.deactivate() def deactivate(self): deleted = now() self.update(active=False, deleted=deleted) def active(self): return self.filter(active=True) class DeactivateManager(models.Manager): '''''' Manager that returns a DeactivateQuerySet, to prevent object deletion. '''''' def get_query_set(self): return DeactivateQuerySet(self.model, using=self._db) def active(self): return self.get_query_set().active()

y crea un mixin:

class DeactivateMixin(models.Model): '''''' abstract class for models whose rows should not be deleted but items should be ''deactivated'' instead. note: needs to be the first abstract class for the default objects manager to be replaced on the subclass. '''''' active = models.BooleanField(default=True, editable=False, db_index=True) deleted = models.DateTimeField(default=None, editable=False, null=True) objects = DeactivateManager() class Meta: abstract = True

otras cosas interesantes

Tengo un modelo Django que mantiene la configuración básica de la función de una aplicación. Nunca debes borrar este modelo. Estoy tratando de hacer cumplir esta aplicación en todo. He deshabilitado la función de eliminación en el administrador y también deshabilité el método de eliminación en el modelo, pero QuerySet tiene su propio método de eliminación. Ejemplo:

MyModel.objects.all()[0].delete() # Overridden, does nothing MyModel.objects.all().delete() # POOF!

Irónicamente, los documentos de Django dicen que esto tiene que decir acerca de por qué delete () es un método en QuerySet y no Manager:

Este es un mecanismo de seguridad para evitar que solicite accidentalmente Entry.objects.delete () y elimine todas las entradas.

Cómo tener que incluir .all() es un "mecanismo de seguridad" es cuestionable por decir lo menos. En cambio, esto crea efectivamente una puerta trasera que no se puede cerrar por medios convencionales (anulando al administrador).

¿Alguien tiene una idea de cómo anular este método en algo tan central como QuerySet sin parchear la fuente?


Puede anular Manager''s QuerySet predeterminado de un Manager''s anulando el método Manager.get_query_set() .

Ejemplo:

class MyQuerySet(models.query.QuerySet): def delete(self): pass # you can throw an exception class NoDeleteManager(models.Manager): def get_query_set(self): return MyQuerySet(self.model, using=self._db) class MyModel(models.Model) field1 = .. field2 = .. objects = NoDeleteManager()

Ahora, MyModel.objects.all().delete() no hará nada.

Para más información: Modificación de los conjuntos de consulta iniciales del administrador.