Definieren Sie Ihre eindeutige Einschränkung über ein weiteres Feld:deleted
und Ihre pseudo-eindeutigen Felder. Weisen Sie dann, um ein vorläufiges Löschen darzustellen, die ID des Modells deleted
zu; Weisen Sie für nicht gelöschte Elemente 0 zu.
Bei diesem Ansatz gilt für nicht gelöschte Elemente, da deleted
-Feld einen konsistenten Wert hat, ignoriert die Mehrfeld-Eindeutigkeitsbeschränkung effektiv den Wert von deleted
und Eindeutigkeit nur für die Pseudo-Eindeutigkeitsfelder erzwingen; für gelöschte Elemente deleted
wird berücksichtigt, und da es eindeutig ist, wird die Einschränkung immer erfüllt – sodass eine beliebige Anzahl von Modellen mit denselben pseudo-eindeutigen Feldwerten koexistieren kann.
Der folgende Code könnte beispielsweise das sein, wonach Sie suchen.
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')