Django:固定长度的CharField,怎么样?

我想在我的模型中有一个固定长度的CharField。 换句话说,我希望只有一个指定的长度是有效的。

我试图做类似的事情

volumenumber = models.CharField('Volume Number', max_length=4, min_length=4) 

但它给了我一个错误(似乎我可以同时使用max_length和min_length)。

还有另一种快捷方式吗?

谢谢

编辑:

根据一些人的build议,我会更具体些:

我的模型是这样的:

 class Volume(models.Model): vid = models.AutoField(primary_key=True) jid = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal") volumenumber = models.CharField('Volume Number') date_publication = models.CharField('Date of Publication', max_length=6, blank=True) class Meta: db_table = u'volume' verbose_name = "Volume" ordering = ['jid', 'volumenumber'] unique_together = ('jid', 'volumenumber') def __unicode__(self): return (str(self.jid) + ' - ' + str(self.volumenumber)) 

我想要的是volumenumber必须是正好4个字符。

IE浏览器如果有人插入'4b'django给出一个错误,因为它期望一个4个字符的string。

所以我尝试了

 volumenumber = models.CharField('Volume Number', max_length=4, min_length=4) 

但它给了我这个错误:

 Validating models... Unhandled exception in thread started by <function inner_run at 0x70feb0> Traceback (most recent call last): File "/Library/Python/2.5/site-packages/django/core/management/commands/runserver.py", line 48, in inner_run self.validate(display_num_errors=True) File "/Library/Python/2.5/site-packages/django/core/management/base.py", line 249, in validate num_errors = get_validation_errors(s, app) File "/Library/Python/2.5/site-packages/django/core/management/validation.py", line 28, in get_validation_errors for (app_name, error) in get_app_errors().items(): File "/Library/Python/2.5/site-packages/django/db/models/loading.py", line 131, in get_app_errors self._populate() File "/Library/Python/2.5/site-packages/django/db/models/loading.py", line 58, in _populate self.load_app(app_name, True) File "/Library/Python/2.5/site-packages/django/db/models/loading.py", line 74, in load_app models = import_module('.models', app_name) File "/Library/Python/2.5/site-packages/django/utils/importlib.py", line 35, in import_module __import__(name) File "/Users/Giovanni/src/djangoTestSite/../djangoTestSite/journaldb/models.py", line 120, in <module> class Volume(models.Model): File "/Users/Giovanni/src/djangoTestSite/../djangoTestSite/journaldb/models.py", line 123, in Volume volumenumber = models.CharField('Volume Number', max_length=4, min_length=4) TypeError: __init__() got an unexpected keyword argument 'min_length' 

这显然不会出现,如果我只使用“max_length”或“min_length”。

我读了django网站上的文档,似乎我是对的(我不能一起使用),所以我问是否有另一种方法来解决这个问题。

再次感谢

CharField数据库模型字段实例只有一个max_length参数,如文档中所示 。 这可能是因为在SQL中只有最大字符长度的限制。

另一方面, 表单字段CharField对象确实有一个min_length参数。 因此,您必须为此特定模型编写自定义的ModelForm,并使用自定义的模型覆盖默认的pipe理模型窗体。

类似的东西:

 # admin.py from django import forms ... class VolumeForm(forms.ModelForm): volumenumber = forms.CharField(max_length=4, min_length=4) class Meta: model = Volume class VolumeAdmin(admin.ModelAdmin): form = VolumeForm ... admin.site.register(Volume, VolumeAdmin) 

你甚至不必写一个自定义的。 只要使用Django提供的RegexValidator

 from django.core.validators import RegexValidator class MyModel(models.Model): myfield = models.CharField(validators=[RegexValidator(regex='^.{4}$', message='Length has to be 4', code='nomatch')]) 

从Django Docs: class RegexValidator(\[regex=None, message=None, code=None\])

regex :要匹配的有效正则expression式。 有关Python中正则expression式的更多信息,请查看这个优秀的HowTo: http : //docs.python.org/howto/regex.html

message :如果失败,则返回给用户的消息。

code :由ValidationError返回的错误代码。 对于您的使用情况不重要,您可以将其忽略。

注意,我build议的正则expression式将允许任何字符,包括空格。 要仅允许字母数字字符,请replace“。” 在正则expression式中使用'\ w'。 对于其他要求,ReadTheDocs;)。

类似上述,但为了什么是值得你也可以继续与Django提供的MinLengthValidator。 为我工作。 代码看起来像这样:

 from django.core.validators import MinLengthValidator ... class Volume(models.Model): volumenumber = models.CharField('Volume Number', max_length=4, validators=[MinLengthValidator(4)]) ... 

您可以按照@Benbuild议的方式编写自定义validation器。 截至本答案的date,可以在https://docs.djangoproject.com/en/dev/ref/validators/find相关说明。;

代码会是这样的(从链接复制):

 from django.core.exceptions import ValidationError def validate_length(value,length=6): if len(str(value))!=length: raise ValidationError(u'%s is not the correct length' % value) from django.db import models class MyModel(models.Model): constraint_length_charField = models.CharField(validators=[validate_validate_length])