Django 모델에서 UUID를 기본 키로 사용 (일반 관계 영향)
여러 가지 버전 ^, 일부 Django 모델에서 UUID를 기본 키로 사용하고 싶습니다. 이렇게하면 ContentType을 일반 관계를 통해 사용하는 "contrib.comments", "django-voting"또는 "django-tagging"과 같은 외부 앱을 계속 사용할 수 있습니까?
"django-voting"을 사용하면 투표 모델은 다음과 같습니다.
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.SmallIntegerField(choices=SCORES)
이 앱은 투표중인 모델의 기본 키가 정수라고 가정하는 것입니다.
기본 제공되는 댓글 앱은 정수가 아닌 PK를 처리 할 수있는 것입니다.
class BaseCommentAbstractModel(models.Model):
content_type = models.ForeignKey(ContentType,
verbose_name=_('content type'),
related_name="content_type_set_for_%(class)s")
object_pk = models.TextField(_('object ID'))
content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")
이 "정수 PK 가정"문제가 UUID 사용을 어렵게 만드는 세리 앱의 일반적인 상황입니까? 아니면 내가이 상황을 잘못 읽었 을까요?
Django에서 너무 많은 문제를 일으키지 않고 UUID를 기본 키로 사용하는 방법이 있습니까?
^ 몇 가지 이유 : 개체 수있는 개체, URL "ID 크롤링"방지, 여러 서버를 사용하여 충돌하지 않는 개체 만들기, ...
UUID 기본 키는 일반적으로 효율성 문제를 수 있습니다. 모든 외래 키는 기계어보다 저장하고 결합하는 데 훨씬 더 비쌉니다.
그러나 UUID가 기본 키가 될 필요는 없습니다. 모델을 uuid 필드로 보완하여 보조 키로 만드십시오 unique=True
. 암시 적 기본 키를 기본 (시스템 내부) 사용하고 UUID를 외부 식별자로 사용합니다.
문서에서 볼 수 있듯이 장고 1.8에는 내장 UUID 필드가 있습니다. UUID와 정수를 사용할 때의 성능 차이는 무시할 수 있습니다.
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
상황에 처해 비슷한 공식 장고 문서 에서 관련 모델 object_id
의 primary_key와 와 동일한 유형일 필요가 없다는 것을 알게되었습니다 . 예를 들어 IntegerField 및 CharField ID 모두에 대해 일반 관계를 유효하게 하려면 CharField로 설정 object_id
하면 됩니다 . 정수가 있기 때문에 강제 변환이 가능하므로 괜찮습니다. 동일은 간다 UUIDField .
예 :
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.CharField(max_length=50) # <<-- This line was modified
object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.SmallIntegerField(choices=SCORES)
"Django가 자동 증가하는 대신 모든 테이블의 모든 데이터베이스 ID가 UUID를 사용하는 방법이 정수입니까?"로 다시 표현할 수 있습니다.
물론입니다.
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
내 모든 테이블에서 작업을 수행 할 수 없습니다.
- 세체 모듈
- Django는 ManyToMany 테이블을 생성했습니다.
이는 Django 기능이 누락 된 기능입니다.
'ProgramingTip' 카테고리의 다른 글
Bower : 2 가지 버전의 jQuery 설치 (0) | 2020.10.15 |
---|---|
태그 (0) | 2020.10.15 |
Java에서 디렉토리 컨텐츠를 삭제하는 방법은 무엇입니까? (0) | 2020.10.15 |
프레임 워크를 사용할 수 없음 GoogleToolboxForMac (0) | 2020.10.15 |
생성자가 최종적이 될 수없는 이유 (0) | 2020.10.15 |