Я имею в виду следующий репозиторий GitHub, основанный на Django 2.0 и cookiecutter-django: github.com/Apfelschuss/apfelschuss/дерево/c8851430201daeb7d1d81c5a6b3c8a639ea27b02
Я получаю следующую ошибку при попытке запустить приложение:
RuntimeError: Model class votes.models.Author doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
Ошибка появилась с эта строка кода.
Я попытался сделать, как описано в https://stackoverflow.com/a/40206661/5894988, но безуспешно:
конфиг/настройки/base.py
LOCAL_APPS = [
"apfelschuss.votes.apps.VotesConfig"
]
apfelschuss/голоса/apps.py
from django.apps import AppConfig
class VotesConfig(AppConfig):
name = "apfelschuss.votes"
verbose_name = "Votes"
Любая идея, что я делаю неправильно?
Если кому интересно, как запустить докер-контейнер репо. Описано здесь.
Когда он говорит: «Модельный класс xxx не объявляет явно app_label», ваши модели могут указать Meta
для определения своих app_label
. Вы также можете настроить имя таблицы базы данных вместе с множеством других параметров как часть метаданных.
Вам нужно сделать что-то подобное на всех ваших моделях;
class Author(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_picture = models.ImageField()
class Meta:
app_label = 'apfelschuss.votes'
def __str__(self):
return self.user.username
редактировать
Я проверил ваш репозиторий и думаю, что вы слишком усложняете проект, имея приложения users
и votes
под apfelschuss
.
Я вытащил их в корень проекта, и все работает гладко; https://github.com/marksweb/apfelschuss/tree/so/questions/55553252
Это более типичный подход к структуре проекта в проектах django/python.
Да, технически это не нужно, но об этом говорит ваша ошибка. Я думаю, что app_label
на моделях не поддерживает этот подход с пунктирным путем - я пытался проиллюстрировать концепцию больше всего на свете. Кроме того, я запускаю ваше приложение в django 2.2 без проблем. Я попробую ваш полный проект и докер, но приложение apfelschuss.votes.apps.VotesConfig
загружается и устанавливается.
Спасибо за ваш ценный отзыв Марк. Поскольку я использую cookiecutter-django в качестве скелета, я предпочитаю, чтобы приложения находились в папке второго уровня apfelschuss
(см. № 1876).
ЭТО ДОЛЖЕН БЫТЬ ПРИНЯТЫЙ ОТВЕТ! В моем случае я переместил модели в другое место и должен был добавить Meta
, как вы указали, чтобы все заработало. Спасибо и за ссылку. Изменение относительно абсолютного импорта, как предложено в другом ответе, не помогает - я уже использовал абсолютные пути и имел эту проблему.
Работа с абсолютным импортом в представлении решила мою проблему. Я изменил .модели на apfelschuss.votes.models.
Код, который приводит к ошибке времени выполнения:
from django.shortcuts import render
from .models import Voting
Проблема решена с абсолютным импортом:
from django.shortcuts import render
from apfelschuss.votes.models import Voting
См. коммит на GitHub здесь.
Правильный ответ — добавить Meta
. Абсолютный импорт ничего не делает, если вы моделируете и не находитесь в том же каталоге/пакете, что и приложение.
Абсолютный импорт работал у меня без каких-либо других изменений в модели. Я бы предпочел относительный импорт. Есть ли способ сделать это?
Вы случайно добавили название своего приложения в разделе MIDDLEWARE
в settings.py
.
Потратил некоторое время на отладку, подумал, что это может помочь сэкономить чье-то время.
Благодарим вас за отзыв и устранение неполадок, Mujeeb. Честно говоря, я не совсем уверен, где вы имеете в виду? У меня нет settings.py, так как я работаю с настройкой Cookiecutter. См. здесь. Установленные приложения в base.py — это INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
, но я не добавлял свое приложение в промежуточное ПО.
Спасибо, Филипп. Итак, я получил ту же ошибку, что и вы, и ошибка была такой, как указано выше. Ответ, конечно, не для вас, а для кого-то другого, который, возможно, придет в будущем и столкнется с той же проблемой. Если это никак не поможет, дайте мне знать, и я удалю это. Спасибо.
А, теперь я понял :-) Я уверен, что это поможет другим. Спасибо за разъяснение Муджиб.
Я использую Python 3.7.5 в VS Code. Эта же проблема смущала меня. Зашел в изначально созданный проект и нашел settings.py
Зашел в раздел
INSTALLED_APPS = []
и добавил
'myapp.apps.MyappConfig'
, - убедитесь, что он правильно оформлен
это относится к классу в apps.py в приложении, вызывающем проблемы
У меня была такая же ошибка, и я исправил ее, добавив отсутствующий файл __init__.py
(просто пустой файл) в мой основной модуль внутри корня моего проекта.
~/my_project
foo/
models.py
tests.py
__init__.py # <-- Added an empty __init__.py here
В файле приложения.py видим:
class ArticlesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'Django.apps.articles'
Нам нужно имя «Django.apps.articles».
Теперь напишите в терминале:
from Django.apps.articles.models import Article
И все рабочие! Я столкнулся с этой проблемой в PyCharm.
Спасибо за ваш ценный отзыв Марк. На самом деле эта модель не определена вне INSTALLED_APPS, верно? Извините, я новичок в питоне. Тем не менее, я добавил мета, как описано, но, к сожалению, я получил ValueError: Недопустимая ссылка на модель 'apfelschuss.votes.Voting_categories'. Ссылки на строковые модели должны иметь вид app_label.ModelName.. Я пробовал также некоторые другие строки без успеха.