Zdefiniuj swoje unikalne ograniczenie w jeszcze jednym polu:deleted
i twoje pseudo-unikalne pola. Następnie, aby reprezentować nietrwałe usuwanie, przypisz identyfikator modelu do deleted
; dla nieusuniętych elementów przypisz 0.
Przy takim podejściu, dla nieusuniętych elementów, ponieważ deleted
pole ma stałą wartość, wielopolowe ograniczenie unikatowe skutecznie zignoruje wartość deleted
i wymuszać unikalność tylko dla pól pseudounikatowych; dla usuniętych elementów, deleted
zostanie wzięte pod uwagę, a ponieważ jest unikatowe, ograniczenie zawsze będzie spełnione - więc dowolna liczba modeli z tymi samymi wartościami pseudounikalnych pól może współistnieć.
Na przykład poniższy kod może być tym, czego szukasz.
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')