2010-06-30 1 views
0

나는 모델이 있습니다 unique_together(a,b, max_occurences=3) 제약은 위의 모델에 추가 할 수처럼 (각 쌍 c의 최대 3 개 값이 될 수 있습니다 (그래서 내가 뭔가를 필요로 지금unique_together (max_occurences = 3)와 같은 것이 있습니까?

class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 
    c = models.IntegerField() 

을 A, B) 이상적으로는 c의 3 가지 값은 주어진 (a, b)에 대해 고유해야하지만, 무엇을 찾아야할지 모르며 (심지어 이와 같은 것이 MySQL에도 존재하는 경우). 이런 것이 있습니까, 아니면 다음과 같이해야합니다 :

class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 

    c1 = models.IntegerField() 
    c2 = models.IntegerField() 
    c3 = models.IntegerField() 

    class Meta: 
     unique_together = ('a', 'b') 

- 핸들 c1..c3 자신?

+0

데이터를 더 잘 모델링해야합니다. –

+0

나는 그것을 고려한다 - 지금 무엇? –

답변

0

모델의 save() 메소드를 대체하고 각각의 저장 전에 제한 조건을 점검하고 제한 조건을 위반하는 경우 ValueError를 발생시켜야합니다.

class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 
    c = models.IntegerField() 

    def save(self): 
     try: 
      # Check values in model here 
     except: 
      raise ValueError("Cannot save more than 3 Cs with an A") 
     super(MyModel, self).save(*args, **kwargs) 
+0

예, 허약합니다. 해커가 발사 할 수 있습니다. 20 개의 동시 요청을 처리하고 허용 된 수준 이상으로 통계를 향상시킵니다. 나는 바위가있는 db-side 솔루션을 원한다. –

+0

내가 생각할 수있는 유일한 것은 데이터베이스 자체에서 수행되는 것이 될 것입니다. 이 질문을 닫고이 모델의 SQL 버전으로 PostgreSQL 또는 MySQL에서 새 질문을 열어야합니다. 당신은 그것을 별도로 유지해야 할 것이고 그것은 이식 가능하지 않을 것이다. 20 개의 동시 요청으로 인해 사용자가 save() 메소드를 초과 할 수 없습니다. –

+0

감사합니다. –