Конфликтующие модели '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 (первый подход) шаги для разделения моделей в каталоге моделей следующие:

  1. Создайте каталог models внутри определенной папки app, рядом с файлом models.py, который вы хотите разделить
  2. .
  3. Создайте init.py внутри models папки
  4. .
  5. Далее, внутри папки models создайте несколько файлов .py с моделями Django, объявленными так, как это обычно делается внутри models.py. Вы можете иметь столько моделей, сколько необходимо в каждом .py файле и столько .py файлов, сколько посчитаете нужным (например, по одной модели на файл)
  6. .
  7. файл init должен сделать относительный импорт для каждой из моделей - внутри файлов .py - чтобы сделать их видимыми для приложения
  8. .
  9. Этот однострочный синтаксис - from .<file> import <model_class> - должен быть использован в init.py для каждой модели, объявленной в .py файлах внутри папки models.

Примечание:для получения дополнительной информации и советов, смотрите https://www.webforefront.com/django/modelsoutsidemodels.html

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