Как сохранить оригинальный идентификатор, используя UUID в качестве первичного ключа в проекте Django RF? - PullRequest
0 голосов
/ 05 февраля 2019

Я хотел бы использовать два разных первичных ключа в моем приложении базы данных DRF.По умолчанию django «создает» id как PK, но когда я пытаюсь определить новое поле в модели (uuid = models.UUIDField (primary_key = True, default = uuid.uuid4, editable = False)), поле id по умолчанию не определено(в БД существуют только uuid).

Как инициализировать их обоих?

Могу упомянуть, что я не определил поле id в моей модели, потому что оно (или должно быть - как я полагаю) добавляется с помощью DRF.

class Store(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, 
editable=False)
    name = models.CharField(max_length=100, blank=False)
    url = models.URLField(max_length=300, blank=False)
    country = models.CharField(max_length=100, blank=True)

1 Ответ

0 голосов
/ 05 февраля 2019

Первичный ключ

В реляционной модели баз данных первичный ключ - это конкретный выбор минимального набора атрибутов (столбцов), которые однозначно определяют кортеж (строку) в отношении (таблице).

Таким образом, вы можете использовать первичный ключ по умолчанию id или uuid (на ваш выбор).

Если вы хотите использовать оба варианта, вместо этого используйте unique=True.

class Store(models.Model):
  uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
  name = models.CharField(max_length=100, blank=False)
  url = models.URLField(max_length=300, blank=False)
  country = models.CharField(max_length=100, blank=True)

Для вашего случая вы можете изменить модель на

from django.db.models.fields import AutoField
from django.db.models.fields import checks
from django import models

class AutoFieldNonPrimary(AutoField):

    def _check_primary_key(self):
        if self.primary_key:
            return [
                checks.Error(
                    "AutoFieldNonPrimary must not set primary_key=True.",
                    obj=self,
                    id="fields.E100",
                )
            ]
        else:
            return []

class Store(models.Model):
      id = models.AutoFieldNonPrimary(unique=True)
      uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
      name = models.CharField(max_length=100, blank=False)
      url = models.URLField(max_length=300, blank=False)
      country = models.CharField(max_length=100, blank=True)
...