, default
값을 callable로 설정할 수 있습니다.이 값은 오브젝트가 생성 될 때마다 함수를 호출하기 때문에 더 좋지만, 필드 definit에서 호출하면 유용합니다 이 intepret 시간
unique_id = models.CharField(db_index=True, default=generate_id)
에 한 번 호출됩니다에 두 번째로 내가 당신을 위해 임의의 문자열의 생성을 수행 인 UUIDField
를 사용하는 것이 좋습니다 것입니다.
문제를 해결하려면 2 가지 방법이 있습니다. unique_id
꽤 길게 생성하십시오. 12 자 이상이어야합니다. 그러면 충돌이 거의 발생하지 않을 것입니다. 또는 당신은 당신의 generate_id
기능에 DB 검사를 추가 할 수 있습니다
def generate_id(length=6):
unique_id = ''.join(random.choice(a) for i in range(length))
while Mymodel.objects.filter(unique_id=unique_id).exists():
unique_id = ''.join(random.choice(a) for i in range(length))
return unique_id
방법 모델은
class Post(models.Model):
def _generate_id(self, length=6):
unique_id = ''.join(random.choice(a) for i in range(length))
while self.__class__.objects.filter(unique_id=unique_id).exists():
unique_id = ''.join(random.choice(a) for i in range(length))
return unique_id
아래의 예에서와 같이 self.__class__
를 통해 액세스하지만 방법이 될 것입니다 경우 당신은하지 않습니다 수 있습니다 자동 응답 코멘트self
인스턴스가 없으므로 기본값으로 필드에 추가 할 수 있어야합니다. 하지만 @classmethod
데코레이터를 사용해보세요. 이것은 오브젝트를 인스턴스화하기 전에 _generate_id
을 정의한 경우에만 가능하며 파이썬 클래스는 자신의 작은 네임 스페이스이기 때문에 @classmethods
에서만 작동합니다.
class Post(models.Model):
@classmethod
def _generate_id(cls, length=6):
unique_id = ''.join(random.choice(a) for i in range(length))
while cls.objects.filter(unique_id=unique_id).exists():
unique_id = ''.join(random.choice(a) for i in range(length))
return unique_id
unique_id = models.CharField(db_index=True, default=_generate_id, max_length=12)
하지만 실생활에서 나는 결코 이것을 시도하지 않았습니다.
기본 속성에서 함수를 호출하면 안됩니다. 호출 가능 자체를 전달하십시오. –
머리를 가져 주셔서 감사합니다. – static