Почему мои валидаторы django не импортируются?

У меня есть базовый проект django (mysite), с одним приложением: my_app.

В приложении есть следующее models.py:

from django.db import models
from mysite.validators import global_file_validator
from .validators import local_file_validator

class Test(models.Model):
    file = models.FileField(validators=[global_file_validator, local_file_validator])

Определяет один FileField, который должен пройти 2 валидатора.

Один из валидаторов (global_file_validator) является более общим, поэтому он определен в разделе mysite.validators, где его могут использовать несколько приложений. Другой валидатор специфичен для данного приложения, поэтому он определен в этом приложении под my_app/validators/local_file_validator.py.

Насколько я могу судить, все должно работать, но когда я пытаюсь сделать ./manage.py makemigrations, я получаю следующее:

Traceback (most recent call last):
  File "./manage.py", line 22, in <module>
    main()
  File "./manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/core/management/base.py", line 89, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 88, in handle
    loader = MigrationLoader(None, ignore_no_migrations=True)
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/db/migrations/loader.py", line 53, in __init__
    self.build_graph()
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/db/migrations/loader.py", line 214, in build_graph
    self.load_disk()
  File "/home/tal/test_django_app/venv3/lib/python3.8/site-packages/django/db/migrations/loader.py", line 116, in load_disk
    migration_module = import_module(migration_path)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 848, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/tal/test_django_app/my_app/migrations/0001_initial.py", line 8, in <module>
    class Migration(migrations.Migration):
  File "/home/tal/test_django_app/my_app/migrations/0001_initial.py", line 20, in Migration
    ('file', models.FileField(upload_to='', validators=[mysite.validators.global_file_validator, my_app.validators.local_file_validator.local_file_validator])),
AttributeError: 'function' object has no attribute 'local_file_validator'

Полный код можно найти здесь: https://github.com/tal-zvon/broken-django-validators

Почему это не работает? Что я делаю неправильно?

В вашей оболочке вы импортируете следующим образом:

from my_app.validators.local_file_validator import local_file_validator

Но в вашем models.py вы импортируете:

from .validators import local_file_validator

Оба они не могут быть правильными. В models.py это должно быть:

from .validators.local_file_validator import local_file_validator

Вернуться на верх