Defina su restricción única en un campo más:deleted
y sus campos pseudo-únicos. Luego, para representar una eliminación temporal, asigne la identificación del modelo a deleted
; para elementos no eliminados, asigne 0.
Con este enfoque, para elementos no eliminados, ya que deleted
el campo tiene un valor consistente, la restricción única de múltiples campos ignorará efectivamente el valor del deleted
y hacer cumplir la unicidad solo para los campos pseudo-únicos; para elementos eliminados, deleted
se tendrá en cuenta, y dado que es único, la restricción siempre se cumplirá, por lo que puede coexistir cualquier número de modelos con los mismos valores de campos pseudo-únicos.
Por ejemplo, el siguiente código podría ser lo que está buscando.
class Deletable(models.Model):
deleted = models.IntegerField(default=0)
class Meta:
abstract=True
def soft_delete(self):
self.deleted=self.id
self.save()
class ConcreteModel(Deletable):
a = models.IntegerField()
b = models.IntegerField()
class Meta:
unique_together=('a', 'b', 'deleted')