Definiera din unika begränsning i ytterligare ett fält:deleted
och dina pseudo-unika fält. Sedan, för att representera en mjuk borttagning, tilldela modellens id till deleted
; för återställda objekt, tilldela 0.
Med detta tillvägagångssätt, för återställda objekt, eftersom deleted
fältet är konsekvent värderat, kommer den unika begränsningen med flera fält effektivt att ignorera värdet för den deleted
och framtvinga unikhet för bara de pseudo-unika fälten; för raderade objekt, deleted
kommer att tas med i beräkningen, och eftersom det är unikt kommer begränsningen alltid att vara uppfylld - så vilket antal modeller som helst med samma pseudo-unika fältvärden kan samexistera.
Till exempel kan följande kod vara vad du letar 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')