2012-06-12 2 views
2

개체가 실제로 삭제되지 않고 삭제 된 것으로 표시된 테이블이 있다고합시다. 이제 특정 필드 값 집합과 함께 하나의 삭제되지 않은 개체 만있을 수 있다는 제약 조건을 적용하려고하지만 같은 필드 값을 가진 삭제 된 여러 개체를 가질 수 있습니다.조건부 고유성 제약을 적용하는 방법

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') 

제약 조건을 적용하는 가장 좋은 방법은 무엇입니까?

답변

1

는 또 하나 개의 필드에 걸쳐 고유 제한 조건을 정의 deleted하고 의사의 고유 필드를. 그런 다음 소프트 삭제를 나타내려면 모델의 ID를 deleted에 할당하십시오. deleted 필드가 지속적으로 값이기 때문에 삭제되지 않은 항목, 삭제되지 않은 항목에 대해,이 방법 0

을 할당, 다중 필드 고유 제한 조건을 효과적으로 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') 
+0

좋은 아이디어. 이 중 하나를 수행하거나 삭제 된 행에 대해 null을 사용합니다.이 행은 신경 쓰이는 모든 데이터베이스에서 고유 한 것으로 처리됩니다. 나는 아직 어느 것을 결정하지 않았다 :) – ykaganovich