1. ホーム
  2. django

[解決済み] CharFieldの長さを固定にする方法は?

2023-03-16 18:49:16

質問

モデル内に長さが固定されたCharFieldを持ちたいと考えています。言い換えれば、私は指定された長さだけが有効であることを望む。

私は次のようなことをしようとしました。

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

と表示されますが、エラーになります(max_lengthとmin_lengthは同時に使用できるようです)。

他に手っ取り早い方法はないでしょうか?

私のモデルはこれです。

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文字でなければならないということです。

すなわち を挿入すると、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" or "min_length" だけでは表示されないですね。

djangoのWebサイトのドキュメントを読みましたが、私が正しいようです(両方を一緒に使うことはできません)ので、問題を解決するための他の方法があるかどうかを尋ねています。

どのように解決するのですか?

CharFieldデータベースモデルのフィールドインスタンスには、以下のようなものしかありません。 max_length パラメータで示されるように ドキュメント . これは、おそらく SQL では最大文字数の制約に相当するものしかないためです。

フォームフィールド CharField 一方、オブジェクトには min_length パラメータがあります。ですから、この特定のモデルのためにカスタムの ModelForm を書き、カスタムのものでデフォルトの管理モデルフォームをオーバーライドする必要があります。

というような感じです。

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