해결된 질문
22.12.05 18:56 작성
·
336
·
수정됨
1
아래와 같이 정의한 상황에서, SomeModel Object를 생성 시 code는 자동으로 Generate 됩니다. 그런데 자동으로 생성된 code가 만약 DB Record 중 하나와 중복된다면 이후에는 어떤 Action이 진행되나요?
바라기로는 code가 다시 generate되고 그 code가 중복되지 않는다면 DB에 Record가 생성되면 좋겠지만 그렇게 진행될까요?
from django.utils.crypto import get_random_string
def generate_code(length=8):
return get_random_string(length)
class SomeModel(models.Model):
...
code = models.CharField(max_length=8, unique=True, null=False, default=generate_code)
...
답변 1
1
2022. 12. 05. 22:43
안녕하세요.
모델 필드의 default 인자로 지정되는 함수는 함수 호출 시점에 값을 결정할 수 있다는 특징이 있을 뿐, 순수 함수로서 값 만을 반환해야만 하는 함수입니다. 그러니 중복여부를 체크하는 로직을 넣으셔서는 안 됩니다.
unique=True가 지정된 필드의 default로 지정된 함수에서 중복이 발생되는 값을 반환하면 DB단에서 unique 제약사항 위배에 따른 오류가 발생합니다.
그렇기에 유일성을 지키시면서 default 인자를 사용코자 하신다면, uuid4처럼 값 그 자체로 유일성을 지키는 값을 지정하시는 것이 좋습니다.
그렇지 않다면, default 인자는 사용하지 마시고, 별도로 이를 구현해주셔야 합니다.
화이팅입니다. :-)
2022. 12. 06. 09:09
답변 감사합니다!
추가 질문이 있는데요, Serializer.save 에서 유일성을 확인하는 Logic을 추가하면 되겠는데, 그럼 Model의 save 단에서는 힘들까요?