在Django/MySQL中创建单例表的最佳方法
我想要一个只能有一条记录的表。我的当前解决方案是:
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
? 这是我自己编的。其实我也不知道。这里有更专业的人可以帮你解答。