Tentukan batasan unik Anda di satu bidang lagi:deleted
dan bidang pseudo-unik Anda. Kemudian, untuk mewakili penghapusan lunak, tetapkan id model ke deleted
; untuk item yang tidak terhapus, tetapkan 0.
Dengan pendekatan ini, untuk item yang tidak terhapus, karena deleted
bidang bernilai konsisten, batasan unik multi-bidang akan secara efektif mengabaikan nilai deleted
dan menegakkan keunikan hanya untuk bidang pseudo-unik; untuk item yang dihapus, deleted
akan diperhitungkan, dan karena itu unik, batasannya akan selalu terpenuhi - sehingga sejumlah model dengan nilai bidang pseudo-unik yang sama dapat hidup berdampingan.
Misalnya, kode berikut mungkin yang Anda cari.
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')