具有unique_together且没有自动递增的id主键的Django模型

时间:2016-10-11 19:30:41

标签: django postgresql composite-primary-key

所以我有一个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表的任何其他想法都是这样的?

2 个答案:

答案 0 :(得分:1)

而不是使用整数作为主键,您可以使用这样的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 ...

冲突是" unlikly"即使有你的记录数量。

通常没有主键是"坏"。为什么?试想一下如何删除单个记录。

另外,您可以创建一个自定义" bigint"主键,如下所述:

Django BigInteger auto-increment field as primary key?

(非常不情愿的是你很快就会用尽数字:D)

答案 1 :(得分:0)

我没有将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,“字段列表中的未知列'user.id'””)