Definujte své jedinečné omezení v dalším poli:deleted
a vaše pseudo-unikátní pole. Poté, abyste reprezentovali měkké odstranění, přiřaďte id modelu deleted
; pro nesmazané položky přiřaďte 0.
S tímto přístupem pro obnovené položky, protože deleted
pole má konzistentní hodnotu, jedinečné omezení s více poli bude efektivně ignorovat hodnotu deleted
a prosadit jedinečnost pouze pro pseudounikátní pole; u smazaných položek deleted
budou brány v úvahu, a protože je jedinečný, omezení bude vždy splněno – takže může vedle sebe existovat libovolný počet modelů se stejnými pseudojedinečnými hodnotami polí.
Například následující kód může být to, co hledáte.
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')