代码之家  ›  专栏  ›  技术社区  ›  fadedbee

在django/mysql中创建singleton表的最佳方法

  •  0
  • fadedbee  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  2
  •   Manoj Govindan    15 年前

    model validation validate_unique ValidationError HitchingPost.objects.count() != 0

    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!"]})
    

    enum

    Set-once-constant