2010-09-23 32 views
0

我想要一个只能有一条记录的表。我目前的解决办法是:在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的数字是我最近表达这个概念的地方。

是否有这样的事物的数学名称?

感谢,

克里斯。

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

''这是一个数学名称吗?'' - 一个常数? – 2010-09-23 11:03:16

+0

它在MySQL级别执行强制约束。只需尝试'HitchingPost.objects.create(value = 12)',接着是例如'HitchingPost.objects.create(值= 13)'。如果你没有得到IntegrityError,那么你有更广泛的问题。 – 2010-09-23 21:46:08

+0

@Tomasz - 是的,它在Django层强制执行完整性,但MySQL表没有类似的限制。非Django应用程序可以插入value = 13而没有问题。如果你有兴趣,我会挖掘它创建的SQL。 – fadedbee 2010-09-26 20:11:35

回答

2

这是有点丑,不强制在MySQL的水平约束。

如果你担心执法,你应该看看Django的model validation方法。您可以编写一个自定义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?我做到了。事实上,我不知道。这里更好的人会帮助你。

+0

我刚刚实施了这个解决方案,它工作得很好,谢谢!只有我要添加的是,您可以允许创建和更新第一个模型,并在保存模型时检查模型上是否存在主键: 'if not self.pk和HitchingPost.objects。 count()> 0: ...' – errkk 2014-02-07 11:27:28

+0

如果HitchingPost.objects.exclude(id = self.id).count()> 0:允许更新self。 – un33k 2015-04-23 21:31:37

相关问题