Уникальный автоматически сгенерированный идентификатор для различных моделей Django - PullRequest
0 голосов
/ 09 января 2019

У меня есть 3 модельных класса, которые наследуются от родительского абстрактного класса, вот так:

      class ParentClass(models.Model):
          class Meta:
              abstract = True

      class ChildClass1(ParentClass):
          ...


      class ChildClass2(ParentClass):
          ...


      class ChildClass3(ParentClass):
          ... 

Мне было интересно, есть ли способ позволить Django генерировать идентификаторы как обычно, но убедился, что ни один из экземпляров ChildClass1, ChildClass2 или ChildClass3 не будет иметь перекрывающихся идентификаторов. Так, например, следующий код:

    a = ChildClass1.objects.create()
    b = ChildClass2.objects.create()
    c = ChildClass3.objects.create()
    print(a.pk)
    print(b.pk)
    print(c.pk)

Должен вернуться:

    1
    2
    3

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Как насчет идентификатора, равного текущему количеству объектов в БД. Что-то вроде:

class ParentClass(models.Model):
  class Meta:
    abstract = True

  @classmethod
  def get_next_id(cls):
    n_children = ChildClass1.objects.count() + ChildClass2.objects.count() + ChildClass3.objects.count()
    return n_children + 1

class ChildClass1(ParentClass):
  my_id = models.PositiveIntegerField(default=ParentClass.get_next_id, primary_key=True)
   ...

Возможно, вы захотите сделать get_next_id немного более умным, чтобы автоматически проверять все дочерние классы, как с https://stackoverflow.com/a/49295674/1060339

0 голосов
/ 09 января 2019

Вы можете получить уникальный первичный ключ для другой модели

import uuid    
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...