2012-01-13 3 views
20

정확하게 이것을 수행하는 방법을 분명히 이해하지 못하고 있습니다. 누군가 나를 똑바로 설정할 수 있습니까? 다음은 모델입니다.Django unique_together 중복을 막지 못함

class Team(models.Model): 
    teamID=models.CharField(max_length=255) #this will be generated on the iPad 
    name=models.CharField(max_length=255) 
    slug=models.SlugField(max_length=50) 
    teamNumber=models.CharField(max_length=30) 
    checkIn=models.DateTimeField(default=datetime.now()) 
    totalScore=models.IntegerField(max_length=6) 

    class Meta: 
     unique_together = ("teamID", "name", "slug", "teamNumber", "totalScore") 

두 번 연속 제출하면 모든 내용이 저장됩니다. Yikes !!!

+0

또한이 모델을 FK로 사용하는 모델이 있습니다. 그 모델과 관련이 있는지 궁금합니다. – jasongonzales

+0

이것은 데이터베이스 수준에서 시행됩니다.'unique_together' 필드를 추가 한 후에'python manage.py syncdb'를 실행했는지 기억 했습니까? – aganders3

+0

글쎄, 나는 마이 그 레이션을 실행 ... 그냥 평범한 '올 동기화를 시도하자 – jasongonzales

답변

10

(foo, bar) 대신 올바른 중첩 튜플 구문 ((foo,bar),)을 사용해보십시오.

unique_together = (("teamID", "name"), ("slug", "teamNumber")) 

:

https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

+0

나는 쓸모가 없습니다. 여기서 간단한 것을 놓치고있을 것입니다. – jasongonzales

+0

관리자에게 데이터를 입력하면 여기에 문제가 있습니다. Django *는 중복 된 항목을 방지하지만 내 장고 응용 프로그램 데이터를 보내는 이상한 작은 모바일 응용 프로그램은 장고 관리자와 같은 유효성 검사를 수행 할 수 없으며 내 장고 응용 프로그램에서 메시지를받을 수도 없습니다. 난 그냥 장고가 전혀이 데이터를 작성하지 않아도됩니다. 나는 이것이 이상한 사용 사례라는 것을 알고있다. – jasongonzales

+0

이제 앱으로 돌아가 유효성 검사 오류 메시지를 보내기로 결정했습니다. 나는 이것이 지금 일할 것이라고 생각한다.거짓 경보로 유감입니다. – jasongonzales

8

는 예 paremeter의 unique_together 내가 두 개 이상의 요소 튜플을 테스트하지 않은하지만 당신의 예를 들어

를 작동해야 입력으로 튜플 튜플을 수신 또는 :

unique_together = (("teamID", "name", "slug", "teamNumber", "totalScore")) 
+1

두 번째 예제는 1- 요소 튜플에 필요한 후행 쉼표가 없으므로 사실상 길이가 4 인 튜플을 추가 할 필요가없는 괄호로 만듭니다. 그것은 작동하지만 b/c Django는 단 하나의 유일한 그룹 만있는 경우 튜플의 튜플을 요구하지 않습니다. 내 문제는 'unique_together'가 모델이 아닌 Meta 클래스 아래에 있는지 확인하여 해결되었습니다. D' oh! – mattmc3

20

as aganders3 ment 이 제약 조건은 데이터베이스 수준에서 시행됩니다. 이 종류의 제약 조건을 지원하지 않는 SQLite 같은 데이터베이스를 사용하고 있다고 가정합니다.

관리자가 예상 한대로 작동하는 이유는 고유성 검사 자체를 수행하고 있기 때문입니다 (제약 조건 위반을 알리기 위해 데이터베이스에 엄격히 의존하지는 않습니다).

당신은 고유성 제약 조건의 종류 (MySQL의 또는 포스트 그레스 중 하나가 작동합니다) 또는 당신이 사용하는 신호의 체크를 추가 볼 수 있었다 지원하는 데이터베이스 엔진으로 전환 할 수 있습니다 : 내가 추가하지 않고이 방법이 도움이되었다고 http://djangosnippets.org/snippets/1628/

1

을 불필요한 필드

class Request(models.Model): 
user = models.ForeignKey(User, related_name='request_list', on_delete=models.CASCADE) 
requested_user = models.ForeignKey(User, on_delete=models.CASCADE) 
request_date = models.DateField(default=timezone.now()) 
request_status = models.BooleanField(default=False) 

def save(self, *args, **kwargs): 
    # Checking for duplicate requests 
    try: 
     request = Request.objects.get(user=self.user, requested_user=self.requested_user) 
     raise ValidationError('Duplicate Value', code='invalid') 
    except self.DoesNotExist: 
     super(Request, self).save(*args, **kwargs) 

    # checking for reversed duplicate requests 
    try: 
     request_new = Request.objects.get(requested_user=self.user, user=self.requested_user) 
     raise ValidationError('Duplicate Value', code='invalid') 
    except self.DoesNotExist: 
     super(Request, self).save(*args, **kwargs) 

def __str__(self): 
    return self.user.username + '------>' + self.requested_user.username 
관련 문제