【问题标题】:Unique autogenerated ID for differet django models不同 django 模型的唯一自动生成 ID
【发布时间】:2019-01-09 14:19:06
【问题描述】:

我有 3 个模型类继承自父抽象类,如下所示:

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

      class ChildClass1(ParentClass):
          ...


      class ChildClass2(ParentClass):
          ...


      class ChildClass3(ParentClass):
          ... 

我想知道是否有办法让 Django 像往常一样生成 id,但要确保 ChildClass1ChildClass2ChildClass3 的任何实例都不会有重叠的 id。比如下面的代码:

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

应该返回:

    1
    2
    3

【问题讨论】:

    标签: django inheritance django-models


    【解决方案1】:

    id 等于数据库中当前对象的数量怎么样?比如:

    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 一样自动检查所有子类

    【讨论】:

      【解决方案2】:

      您可以获得不同型号的唯一主键

      import uuid    
      id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
      

      【讨论】:

      • 是的,这很酷,但我想知道是否可以像 Django 默认使用模型那样以增量方式自动分配它们。也可能只是整数 id。
      • 我有一个不好的解决方案。转到您的数据库控制台并像这样运行:alter table tablename auto_increment=1000001。您可以从 100000 开始您的第一个模型,从 200000 开始第二个模型等等。
      • 不太可行,该应用程序适用于频繁生成的日志。此外目标受众非常大
      猜你喜欢
      • 2011-04-25
      • 2013-05-31
      • 2021-01-16
      • 1970-01-01
      • 2020-05-30
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多