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

时间:2010-09-23 10:56:04

标签: python mysql django django-models

我想要一张只能有一条记录的桌子。我目前的解决方案是:

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的数字是我最接近表达概念的数字。

是否有这样的数学名称?

谢谢,

克里斯。

P.S。生成的SQL是:

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

1 个答案:

答案 0 :(得分:2)

  

这有点难看,并且不会在MySQL级别强制执行约束。

如果你担心执法,你应该看看Django的model validation方法。您可以撰写自定义validate_unique,如果ValidationError,则会HitchingPost.objects.count() != 0。{/ p>

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?我做到了。事实上我不知道。这里更好的人会帮助你。