Конфликтующие модели 'news' в приложении 'articles': <class 'articles.models.news.News'> и <class 'apps.articles.models.news.News'
У меня есть мои приложения django в папке apps. Из-за множества типов article я решил разделить models.py для приложения articles и поместить его в папку models, где каждый файл modelname.py указывает на модель.
Проблема: настройка фреймворка синдикации (как описано в https://docs.djangoproject.com/en/3.2/ref/contrib/syndication/) вызывает ошибку времени выполнения Conflicting 'news' models in application 'articles': <class 'articles.models.news.News'> and <class 'apps.articles.models.news.News'>
.
Примечание: До добавления функциональности фреймворка синдикации все работает просто отлично.
Я пробовал: Добавление app_label
к модели News.
apps
структура папки:
├── articles
│ ├── admin.py
│ ├── apps.py
│ ├── feeds.py
│ ├── __init__.py
│ ├── models
│ │ ├── __init__.py
│ │ ├── articles.py
│ │ ├── categories.py
│ │ ├── news.py
│ │ ├── reviews.py
│ │ └── tags.py
│ ├── tests.py
│ ├── urls.py
│ └── views
│ ├── __init__.py
│ ├── news.py
├── conftest.py
├── education
├── __init__.py
├── users
/apps/articles/models/news.py
:
from django.db import models
class News(models.Model):
//
// Model Fields
//
class Meta:
...
app_label = 'articles'
...
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("articles:news_detail", kwargs={"slug": self.slug})
/apps/articles/feeds.py
:
from django.contrib.syndication.views import Feed
from django.utils.translation import gettext_lazy as _
from .models.news import News
class NewsEntriesFeed(Feed):
title = _("News")
link = "/news/"
description = _("Latest news")
def items(self):
return News.objects.order_by('-publish_date')[:5]
def item_title(self, item):
return item.title
def item_description(self, item):
return item.lead
/apps/articles/urls.py
:
from django.urls import path
from .views.news import NewsDetailView, NewsListView
from .feeds import NewsEntriesFeed
app_name = "articles"
urlpatterns = [
path("news/", NewsListView.as_view(), name="news_list"),
path("news/<str:slug>/", NewsDetailView.as_view(), name="news_detail"),
path("feed/rss", NewsEntriesFeed(), name="news_feed"),
]
/apps/articles/apps.py
from django.apps import AppConfig
class ArticlesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'articles'
INSTALLED_APPS
INSTALLED_APPS = [
...
...
"apps.articles.apps.ArticlesConfig",
...
]
Я нашел решение в https://www.webforefront.com/django/modelsoutsidemodels.html.
Согласно листингу 7-42
(первый подход) шаги для разделения моделей в каталоге моделей следующие:
- Создайте каталог models внутри определенной папки app, рядом с файлом models.py, который вы хотите разделить .
- Создайте init.py внутри models папки .
- Далее, внутри папки models создайте несколько файлов .py с моделями Django, объявленными так, как это обычно делается внутри models.py. Вы можете иметь столько моделей, сколько необходимо в каждом
.py
файле и столько .py файлов, сколько посчитаете нужным (например, по одной модели на файл) .
- файл init должен сделать относительный импорт для каждой из моделей - внутри файлов .py - чтобы сделать их видимыми для приложения .
- Этот однострочный синтаксис -
from .<file> import <model_class>
- должен быть использован в init.py для каждой модели, объявленной в .py файлах внутри папки models.
Примечание:для получения дополнительной информации и советов, смотрите https://www.webforefront.com/django/modelsoutsidemodels.html