Definieer uw unieke beperking voor nog een veld:deleted
en uw pseudo-unieke velden. Om een zachte verwijdering weer te geven, wijst u de id van het model toe aan deleted
; voor niet-verwijderde items, wijs 0 toe.
Met deze aanpak, voor niet-verwijderde items, aangezien de deleted
veld een consistente waarde heeft, negeert de unieke beperking voor meerdere velden effectief de waarde van de deleted
en uniciteit afdwingen voor alleen de pseudo-unieke velden; voor verwijderde items, deleted
zal in aanmerking worden genomen, en aangezien het uniek is, zal er altijd aan de beperking worden voldaan - dus een willekeurig aantal modellen met dezelfde pseudo-unieke waarden van velden kan naast elkaar bestaan.
De volgende code kan bijvoorbeeld zijn wat u zoekt.
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')