Defina sua restrição exclusiva em mais um campo:
deleted
e seus campos pseudo-exclusivos. Em seguida, para representar uma exclusão reversível, atribua o id do modelo a deleted
; para itens não excluídos, atribua 0. Com esta abordagem, para itens não excluídos, uma vez que o
deleted
for valorizado de forma consistente, a restrição exclusiva de vários campos ignorará efetivamente o valor do deleted
e impor exclusividade apenas para os campos pseudo-exclusivos; para itens excluídos, deleted
será levado em consideração e, como é único, a restrição sempre será satisfeita - portanto, qualquer número de modelos com os mesmos valores de campos pseudo-únicos podem coexistir. Por exemplo, o código a seguir pode ser o que você está procurando.
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')