Définissez votre contrainte unique sur un champ supplémentaire :deleted
et vos champs pseudo-uniques. Ensuite, pour représenter une suppression réversible, attribuez l'identifiant du modèle à deleted
; pour les éléments non supprimés, attribuez 0.
Avec cette approche, pour les éléments non supprimés, puisque le deleted
champ est valorisé de manière cohérente, la contrainte unique multi-champs ignorera effectivement la valeur du deleted
et imposer l'unicité uniquement pour les champs pseudo-uniques ; pour les éléments supprimés, deleted
sera pris en compte, et puisqu'il est unique, la contrainte sera toujours satisfaite - donc n'importe quel nombre de modèles avec les mêmes valeurs de champs pseudo-uniques peuvent coexister.
Par exemple, le code suivant peut correspondre à ce que vous recherchez.
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')