ProgramingTip

Django 모델에서 UUID를 기본 키로 사용 (일반 관계 영향)

bestdevel 2020. 10. 15. 08:10
반응형

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_idprimary_key와 와 동일한 유형일 필요가 없다는 것을 알게되었습니다 . 예를 들어 IntegerFieldCharField 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)

내 모든 테이블에서 작업을 수행 할 수 없습니다.

  1. 세체 모듈
  2. Django는 ManyToMany 테이블을 생성했습니다.

이는 Django 기능이 누락 된 기능입니다.

참고 URL : https://stackoverflow.com/questions/3936182/using-a-uuid-as-a-primary-key-in-django-models-generic-relations-impact

반응형