【问题标题】:Django model with unique_together and without auto incremented id primary key具有 unique_together 且没有自动递增 id 主键的 Django 模型
【发布时间】:2017-02-20 11:09:13
【问题描述】:

所以我有一个 Django 模型,其中存储了 5 天的数据,因为数据量太大,我们必须删除所有超过 5 天的数据。该模型当前具有 Django 自动创建的自动递增 id 字段。这里的问题是它很快就无法生成足够大的主键。

理想情况下,我应该有一个复合主键,但 Django 还不支持这个。所以我在查看 unique_together 并想知道是否可以将其用作 pesudo pk 并删除自动递增 id,因为它并没有真正用于应用程序中的任何内容。

另一个选项是这个模块:django-compositekey,但我不确定它的支持程度如何?

在任何一种情况下,我都需要合并 4 列来创建唯一记录:

class MassObservations(models.Model):
    time = models.DateTimeField()
    star = models.ForeignKey('Stars')
    property = models.ForeignKey('Properties')

    observatories = (('1', 'London'),
                     ('2', 'China'),
                     ('3', 'United States'))

    station = models.CharField(max_length=2, choices=observatories)
    mass = models.FloatField()

    class Meta:
        unique_together = ('time', 'star', 'property', 'station')

关于如何处理数据/Django 表的任何其他想法?

【问题讨论】:

    标签: django postgresql composite-primary-key


    【解决方案1】:

    我没有使用 id 作为主键。相反,我使用复合键,你可以这样写:

    class User(models.Model):
        a = models.IntegerField(primary_key=True)
        b = models.IntegerField(primary_key=True)
        c = models.IntegerField(primary_key=True)
    

    所以,当你使用User.objects.get(...)时,你不会看到这个错误:

    OperationalError: (1054, "Unknown column 'user.id' in 'field list'")

    【讨论】:

      【解决方案2】:

      您可以使用这样的 UUID,而不是使用整数作为主键:

      import uuid
      from django.db import models
      
      class MassObservations(models.Model):
          id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
          ... rest of your fields ...
      

      即使您的记录数量也“不太可能”发生冲突。

      一般来说,没有主键是“坏的”。为什么?想想你如何删除一条记录。

      或者,您可以创建自定义“bigint”主键,如下所述:

      Django BigInteger auto-increment field as primary key?

      (很可能你很快就会用完数字:D)

      【讨论】:

      • 32 位(4 字节整数)与 128 位(uuid),所以是存储更高。
      猜你喜欢
      • 2022-11-15
      • 2012-02-15
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多