두 필드를 "고유 한"커플로 정의하는 방법


388

Django에서 고유 한 것으로 몇 개의 필드를 정의하는 방법이 있습니까?

볼륨 (일지) 테이블이 있고 동일한 저널에 대해 하나 이상의 볼륨 번호를 원하지 않습니다.

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

나는 으려고 unique = True분야에서 속성으로 journal_id하고 volume_number있지만 작동하지 않습니다.

답변:


634

unique_together 라는 간단한 솔루션이 있습니다. 원하는 것을 정확하게 수행합니다.

예를 들면 다음과 같습니다.

class MyModel(models.Model):
  field1 = models.CharField(max_length=50)
  field2 = models.CharField(max_length=50)

  class Meta:
    unique_together = ('field1', 'field2',)

그리고 귀하의 경우 :

class Volume(models.Model):
  id = models.AutoField(primary_key=True)
  journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
  volume_number = models.CharField('Volume Number', max_length=100)
  comments = models.TextField('Comments', max_length=4000, blank=True)

  class Meta:
    unique_together = ('journal_id', 'volume_number',)

2
"ValidationError"예외가 발생한다고합니다. Django 문서를 살펴보십시오 : Model.validate_unique
Jens

2
volume_number가 null 일 수 있다면 어떻게 처리합니까? 이 경우 MySQL은 고유하지 않은 것 같습니다.
Greg

26
참고로 복제본을 추가하려고하면 django.db.utils.IntegrityError가 발생합니다.
araneae

8
@Greg-ANSI 표준 SQL : 2003 (및 이전 버전)에 따르면 UNIQUE제약 조건은 NULL값이 아닌 중복을 허용하지 않지만 여러 NULL값을 허용 해야 합니다 (초안 wiscorp.com/sql_2003_standard.zip , Framework, p. 22 참조). 고유 한 제약 조건으로 인해 여러 null 값을 허용하지 않으려면 NULL의미있는 값으로 사용하는 것과 같은 잘못된 작업을 수행 한 것일 수 있습니다 . 널 입력 가능 필드는 "우리는 항상 해당 필드에 대한 값을 가질 수는 없지만 그렇게 할 때 고유해야합니다."라고 말합니다.

2
여러 unique_together제약 조건은 어떻습니까? 예를 들어-부모의 범위에서 모드 열을 고유하게하고 싶습니까? 글쎄,이 속성은 실제로 튜플 자체입니다. docs.djangoproject.com/en/1.4/ref/models/options/…를 참조하십시오. 따라서 제약 조건을보다 명확하게 다음과 같이 작성해야합니다 unique_together = (('journal_id', 'volume_number',),).
Tomasz Gandor

76

장고 2.2+

unique_together 보다 constraints기능을 사용하는 UniqueConstraint것이 좋습니다 .

Django 문서에서 unique_together:

대신 constraints 옵션과 함께 UniqueConstraint를 사용하십시오.
UniqueConstraint는 unique_together보다 더 많은 기능을 제공합니다.
unique_together는 향후 더 이상 사용되지 않을 수 있습니다.

예를 들면 다음과 같습니다.

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name="Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['journal_id', 'volume_number'], name='name of constraint')
        ]

어떤 상황에서 UniqueConstraint의 'name'매개 변수가 사용됩니까? URL 경로의 이름 매개 변수처럼 작동한다고 가정합니까?
user7733611

1
제약 조건의 이름을 @ user7733611로 지정하면 여러 상황에서 도움이 될 수 있습니다. 예를 들어 레거시 데이터베이스에 연결하거나 제약 조건 이름을 데이터베이스에서 사람이 읽을 수있게하려는 경우가 있습니다. 한 번은 MySQL 데이터베이스의 문자 집합을 마이그레이션하고 Django의 생성 된 제약 조건 이름이 실제로 특정 대상에 비해 너무 길었습니다.
mihow

100 % 확신은에서 온다 UniqueConstraint그러나 나는 이상한 얻을 psycopg2.errors.DuplicateTable: relation "name_of_the_constraint" already exists내가 포스트 그레스로 전환 할 때
zar3bski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.