Django : Unable to import model from another App
Asked Answered
T

3

43

I was hoping to seek some assistance on this problem I'm having. I'm still learning Django (and Python) and come across this particular issue that I'm unable to locate an answer for. I've created a new App called "News" and setup the Model for the App. Using the Admin interface I have created some data. From my "Pages" App, I'm trying to import the News_Article class and getting the error No module named News.models.

I am struggling to see what's going wrong here.

Any assistance would be greatly appreciated.

DIR Structure

Bolton_GC [Folder]
- Bolton_GC [Folder]
  - News [Folder]
    - Migrations [Folder]
    - __init__.py
    - __init__.pyc
    - admin.py
    - admin.pyc
    - models.py
    - models.pyc
    - tests.py
    - views.py
  - Pages [Folder]
    - Migrations [Folder]
    - __init__.py
    - __init__.pyc
    - admin.py
    - admin.pyc
    - models.py
    - models.pyc
    - tests.py
    - views.py
    - views.pyc
  - static [Folder]
  - templates [Folder]
  - __init__.py
  - __init__.pyc
  - settings.py
  - settings.pyc
  - urls.py
  - urls.pyc
  - wsgi.py
  - wsgi.pyc
- db.sqlite3
- manage.py

news\model.py

from django.db import models
from datetime import datetime

class News_Article(models.Model):
    class Meta:
        ordering = ['news_datetime_submitted']
    news_title = models.CharField(max_length=75, verbose_name="News Title")
    news_text = models.CharField(max_length=300, verbose_name="News Text")
    news_active = models.BooleanField(default=True, verbose_name="News Active")
    news_datetime_submitted = models.DateTimeField(default=datetime.now(), verbose_name="News Date")

    def __str__(self):
        return self.news_title

Pages\views.py

from django.shortcuts import HttpResponse, get_object_or_404, render
from models import Page, Announcement, Menu, Sub_Menu
from django.core.exceptions import ObjectDoesNotExist
from News.models import News_Article
import pdb

# Helper Functions

def get_announcement():
    try:
        return Announcement.objects.get(announcement_active=True)
    except ObjectDoesNotExist:
        return None

def clean_url(dirtyurl, badlist):
    for item in badlist:
        dirtyurl = dirtyurl.replace(item,'')
    return dirtyurl[1:-1]

# View functions

def page(request):
    rDict = {}
    path = clean_url(request.path, ['"', "'"])
#    pdb.set_trace()
    p = get_object_or_404(Page, urlconf_text=path)
    rDict['p'] = p
    announcement = get_announcement()
    if not announcement == None:
        rDict['announcement'] = announcement
    rDict['sitenav'] = path
    rDict['menu'] = Menu.objects.all().order_by('menu_position')
    return render(request, 'en/public/page.html', rDict)

Error

ImportError at /home/

No module named News.models

Request Method:     GET
Request URL:    http://127.0.0.1:8000/home/
Django Version:     1.8.2
Exception Type:     ImportError
Exception Value:    

No module named News.models

Exception Location:     C:\Me\Websites\Bolton_GC\Bolton_GC\Pages\views.py in <module>, line 4
Python Executable:  c:\python27\python.exe
Python Version:     2.7.9
Python Path:    

['C:\\Me\\Websites\\Bolton_GC',
 'c:\\python27\\lib\\site-packages\\setuptools-18.0.1-py2.7.egg',
 'C:\\WINDOWS\\SYSTEM32\\python27.zip',
 'c:\\python27\\DLLs',
 'c:\\python27\\lib',
 'c:\\python27\\lib\\plat-win',
 'c:\\python27\\lib\\lib-tk',
 'c:\\python27',
 'c:\\python27\\lib\\site-packages']

Server time:    Tue, 14 Jul 2015 13:21:14 +0100
Taryn answered 14/7, 2015 at 12:31 Comment(7)
Interestingly it works in the urls.py file so it must be a folder structure issue but I'm stumped.Taryn
try using `Bolton_GC.News.models import News_Article' - I want to see if it's the structureEustache
Tried that also pal, same issueTaryn
Hmm, that does work, although it didn't. Thats annoying, sorry to bother you and thanks for the prompt reply.Taryn
So it does work? I have added an answerEustache
Yes it does, although definitely tried that. Oh well, not to worry. I've ticked the answer thank you.Taryn
Not a problem. The bigger issue though is the structure of the project - you should be able to just call it News.Models importEustache
E
82

Switch

from News.models import News_Article

to

from Bolton_GC.News.models import News_Article
Eustache answered 14/7, 2015 at 12:52 Comment(4)
If you are using PyCharm, make sure to adjust the content root of your project from Preferences -> Project StructureReach
@Mike building on that, you can set it by right-clicking on django's root folder in PyCharm (ie. the one that contains manage.py and go to Mark Directory As > Sources RootSosthenna
That does not work. I would get no module named Bolton_GC.Shoemake
from django.apps import apps....... member = apps.get_model('APP_NAME.MODEL_NAME'). This should fetch your model from another app and save it in the 'member' variable. Use member.objects.all() and any such ORM queries from this point on. linkTufa
K
42

Just to elaborate on @TheLifeOfSteve's answer, all the import statements are always relative to your manage.py file.

If the manage.py file was at the path Bolton_GC/Bolton_GC, then the correct import statement would just be:

from News.models import News_Article

But in the current directory structure, the following is the correct answer as pointed out by Steve.

from Bolton_GC.News.models import News_Article
Kirstenkirsteni answered 24/12, 2017 at 7:27 Comment(0)
E
2

There is an update in Importing and registering Models!! Please try from .models import News_Article

Egbert answered 20/4, 2021 at 9:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.