Definer din unikke begrænsning på tværs af et felt mere:deleted
og dine pseudo-unikke felter. Tildel derefter modellens id til deleted
for at repræsentere en blød sletning; for fortrydede elementer, tildel 0.
Med denne tilgang, for gendannet elementer, da deleted
feltet er konsekvent værdsat, vil den unikke begrænsning med flere felter effektivt ignorere værdien af den deleted
og håndhæve unikhed for netop de pseudo-unikke felter; for slettede elementer, deleted
vil blive taget i betragtning, og da det er unikt, vil begrænsningen altid være opfyldt - så et hvilket som helst antal modeller med de samme pseudo-unikke felters værdier kan eksistere side om side.
For eksempel kan følgende kode være det, du leder efter.
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')