我想要一张只能有一条记录的桌子。我目前的解决方案是:
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
)
;
答案 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
?我做到了。事实上我不知道。这里更好的人会帮助你。