在Django/MySQL中创建单例表的最佳方法

0 投票
1 回答
1900 浏览
提问于 2025-04-16 04:30

我想要一个只能有一条记录的表。我的当前解决方案是:

class HitchingPost(models.Model):
    SINGLETON_CHOICES = (('S', 'Singleton'),)
    singleton = models.CharField(max_length=1, choices=SINGLETON_CHOICES, unique=True, null=False, default='S');
    value = models.IntegerField()

    def __unicode__(self):
        return u"HitchingPost" # only ever one record

这个方法有点丑,而且在MySQL层面上并没有强制执行这个限制。

有没有更好的解决方案呢?

有没有一种MySQL字段类型只能有一个值(我找到的最小的布尔值有两个可能性)?我觉得0基数的数字是我接近这个概念的最好的方式。

这种东西有没有数学上的名称呢?

谢谢,

克里斯。

附:生成的SQL是:

CREATE TABLE `appname_hitchingpost` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `singleton` varchar(1) NOT NULL UNIQUE,
    `value` integer NOT NULL
)
;

1 个回答

2

这个方法有点难看,而且在MySQL层面上并没有强制执行这个约束。

如果你担心这个约束的执行问题,可以看看Django的模型验证方法。你可以写一个自定义的validate_unique,如果HitchingPost.objects.count() != 0,就会抛出一个ValidationError错误。

class HitchingPost(models.Model):
    ...
    def validate_unique(self, exclude = None):
        from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
        if HitchingPost.objects.count() != 0:
            raise ValidationError({NON_FIELD_ERRORS: ["There can be only one!"]})

有没有更好的解决方案呢?

很难说,因为我还不知道你更广泛的需求是什么。

有没有一种MySQL字段类型只能有一个值(我找到的最小的布尔类型有两个可能的值)?我能想到的最接近的概念是基数0的数字。

你可以尝试一个自定义的单元素enum。我自己没有尝试过这种方法,所以我的建议你可以参考,但不要完全相信。

这种东西有没有数学上的名称?

Set-once-constant? 这是我自己编的。其实我也不知道。这里有更专业的人可以帮你解答。

撰写回答