もう1つのフィールドに固有の制約を定義します:deleted
とあなたの疑似一意のフィールド。次に、ソフト削除を表すために、モデルのIDを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')