Дефинирайте вашето уникално ограничение в още едно поле:deleted
и вашите псевдо-уникални полета. След това, за да представите меко изтриване, присвоете идентификатора на модела на deleted
; за неизтрити елементи задайте 0.
С този подход за неизтрити елементи, тъй като deleted
полето се оценява последователно, уникалното ограничение за много полета ефективно ще игнорира стойността на deleted
и да наложи уникалност само за псевдо-уникалните полета; за изтрити елементи, deleted
ще бъдат взети под внимание и тъй като е уникално, ограничението винаги ще бъде изпълнено – така че всеки брой модели със същите стойности на псевдоуникални полета могат да съществуват едновременно.
Например следният код може да е това, което търсите.
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')