2

オブジェクトが実際に削除されたのではなく、削除済みとマークされたテーブルがたくさんあるとします。ここで、特定のフィールド値のセットを持つ削除されていないオブジェクトは 1 つしか存在できないが、同じフィールド値を持つ複数の削除済みオブジェクトを持つことができるという制約を適用したいと考えています。

class Deletable(models.Model):
    deleted = models.BooleanField(default=False)

    class Meta:
       abstract=True

    def soft_delete(self):
       self.deleted=True
       self.save()

class ConcreteModel(Deletable):
    a = models.IntegerField()
    b = models.IntegerField()

    class Meta:
       #wrong because there may have been some deleted rows
       unique_together=('a', 'b')

制約を強制する最良の方法は何ですか?

4

3 に答える 3

1

一意の制約をもう 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')
于 2012-06-12T23:44:10.567 に答える
0

モデル検証を使用します。

https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

于 2012-06-12T23:31:30.977 に答える