Джанго: Чарфилд с фиксированной длиной, как?


Я хотел бы иметь в моей модели CharField с фиксированной длиной. Другими словами, Я хочу, чтобы действительна только указанная длина.

Я пытался сделать что-то вроде

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

но это дает мне ошибку (кажется, что я могу использовать и max_length и min_length одновременно).

есть ли другой быстрый способ?

спасибо

EDIT:

следовать советам некоторых людей, я буду немного больше конкретно:

моя модель такова:

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 символа.

И. Е. если кто-то вставляет '4b' django дает ошибку, потому что он ожидает строку из 4 символов.

поэтому я попробовал с

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 web сайт и кажется, что я прав (я не могу использовать оба вместе), поэтому я спрашиваю, есть ли другой способ решить проблему.

еще раз спасибо

4 51

4 ответа:

экземпляры полей модели базы данных CharField имеют только

вам даже не нужно писать пользовательский. Просто используйте RegexValidator который поставляет Django.

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:class RegexValidator(\[regex=None, message=None, code=None\])

regex: допустимое регулярное выражение, чтобы соответствовать. Подробнее о регулярных выражений в Python проверить эту прекрасную руководстве: http://docs.python.org/howto/regex.html

message: сообщение возвращается пользователю в случае неудачи.

code: код ошибки, возвращаемый ValidationError. Не важно для вашего случая использования,вы можете оставить его.

осторожно, регулярное выражение, предложенное мной, позволит любые символы, включая пробелы. Чтобы разрешить только буквенно-цифровые символы, замените '.'с '\w ' в аргументе регулярного выражения. Для других требований, ReadTheDocs ;).

вроде бы по тем же линиям, что и выше, но для чего это стоит, вы также можете пойти вперед с MinLengthValidator, который поставляет django. Работать на меня. Код будет выглядеть примерно так:

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

вы можете написать пользовательский валидатор, как предложено @Ben. На дату этого ответа инструкции для этого можно найти по адресу https://docs.djangoproject.com/en/dev/ref/validators/

код будет что-то вроде этого (копирование из ссылки):

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])