so I have 2 apps running in the same project.
My files are structured as follows:
/project_codebase
/project
__init.py
settings.py
urls.py
wsgi.py
...
/app1
...
/app2
...
manage.py
So, I for some weird reason have a different name for my base directory (that is, it ends with codebase). Hopefully, that is not an issue.
In my settings.py, I have this:
INSTALLED_APPS = [
...
'app1',
'app2',
]
Ok, so in my models.py (from app2), I can easily import models from app1 with from app1.models import *, however, when I use from app2.models import * in my models.py (from app1), I get an ImportError.
Any solutions to this?
This might be due to circular import issues. To avoid this you should load the model dynamically:
For recent versions of django (1.7+) use the application registry:
from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')
For earlier django versions (<1.7):
from django.db.models.loading import get_model
MyModel1 = get_model('app1', 'MyModel1')
Note 1: If you want to define a ForeignKey relationship, there is no need for a separate import statement. Django has you covered on this:
If app1 is an installed app, you should define the ForeignKey relationship as follows:
# in app2.py
class MyModel2(models.Model):
mymodel1 = models.ForeignKey('app1.MyModel1')
Note 2: The get_model only works if app1 is an installed app and MyModel1 is the model you want to import from app1.
Note 3: Try to avoid wildcard import (from ... import *), as this is bad practice.
It's definitely a circular import.
But i think is what you need is to use models as some sort of RetationFields(ForeignKey, ManyToManyField or OneToOneField) arguments. So you need to skip import and use as so:
# app1/models.py
class Model1(models.Model):
relation_field = models.ForeignKey('app2.Model2')
From docs:
If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself
To refer to models defined in another application, you can explicitly specify a model with the full application label
Just put str object as first argument to relation fields that leeds to <app_name>.<Model_name>.
Note: it's better to avoid importing everything from module(from <module_name> import *)
If you want to import only some specific module then do not use import *.
It will take more time load your all library and so can affect the speed of your app also.
If you want to use few modules from your second app then just add module name instead of whole libraries something like this:
from app2.models import Module1, Module2
or it may be circular import issue as other clarify.
Thanks.
i use this code always and it's work :)
from position_app.models import Member
You need to specify the model names you want to import, for ex from app1.models import ModelName1, ModelName2.
Make sure there is no name clash between one of your apps and one of the modules installed in your Python environment. If you use pip, you can run pip freezeto see a list of installed modules.
I had the same error when one of my apps was named 'packaging', and the packaging python module was installed.
I also face this problem when I try to import my model from another app in (django2.2)
But at last I Imported It and Its successfully working.
here is my two app:
INSTALLED_APPS = [
...
'categories',
'videos',
]
and this is the code for how I Imported it into videos/models.py file as a ForeignKey Connectivity
from django.db import models
class Videos(models.Model):
categories = models.ForeignKey('categories.Categories', related_name='categories', on_delete=models.CASCADE)
If want to see my Categories Model from categories/models.py file, you can check this code otherwise neglect it
from django.db import models
class Categories(models.Model):
category_name = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
It is a circular import
In my case I needed the imported class not for a relation field, but for use it inside a method instead.
If that's the case, I suggest to import inside the method, otherwise an AppRegistryNotReady("Models aren't loaded yet.") is raised.
class Student(CustomUser):
""" Usuario alumno """
class Meta:
verbose_name = "Alumno"
verbose_name_plural = "Alumnos"
def get_current_school_class(self):
""" Obtiene el curso actual de un alumno """
from school.models import SchoolClass, StudentClass
# proceed with the method...
it's not necessary to import models from others apps
just put the app.models in the foreignkey field and that's work ;)
app 1:
class model1(models.Model):
field=models.field type ...
app 2:
class model2(models.Model):
field=models.ForeignKey('app1.model1', on_delete. ...)
to avoid code correction :D
I need to override createsuperuser.py's handle method in Django Command class.
I created myapp\management\commands\createsuperuser.py:
import getpass
import sys
import django.contrib.auth.management.commands.createsuperuser as makesuperuser
from django.contrib.auth.management import get_default_username
from django.contrib.auth.password_validation import validate_password
from django.core import exceptions
from django.core.management.base import CommandError
from django.utils.encoding import force_str
from django.utils.text import capfirst
class Command(makesuperuser.Command):
def handle(self, *args, **options):
# the rest of code is copied from Django source and is almost
# standart except few changes related to how info of
# REQUIRED_FIELDS is shown
When I do in terminal ./manage.py createsuperuser I do not see any changes. If I change the name of my file to lets say mycmd.py and do ./manage.py mycmd everything starts to work as I expect.
How to get changes I need using ./manage.py createsuperuser?
Put your application name on top in the INSTALLED_APPS list.
I am trying to add django-seo to a test project, but I have an error I don;t know how to solve.
I have followed the django-seo docs:
1. I ran pip install DjangoSEO and then confirmed the install with pip freeze;
2. I added 'rollyourown.seo' to my installed apps;
3. I created a file called seo.py and installed this file alongside my core files: models.py, views.py, forms.py & urls.py. This is the contents of my seo.py file:
from rollyourown import seo
class MyMetadata(seo.Metadata):
title = seo.Tag(head=True, max_length=68)
description = seo.MetaTag(max_length=155)
keywords = seo.KeywordTag()
heading = seo.Tag(name="h1")
4. I added the following code to my urls.py file to set up the admin:
from rollyourown.seo.admin import register_seo_admin
from django.contrib import admin
from test_project.seo import MyMetadata
register_seo_admin(admin.site, MyMetadata)
According to the docs, I should now be able to see the django-seo models in the admin, but do not see them.
Instead, I get the following error:
File "C:\Users\UserName\Desktop\test_project\test_project\core\urls.py", line 5, in <module>
from test_project.seo import MyMetadata
ImportError: No module named seo
Any suggestions would be great.
I'm building django application and i encounter som import problems. My file structure:
project/
my_app/
models/
__init__.py
Article.py
StockMovementProduct.py
tools/
__init__.py
Synchronizer.py
project/my_app/models/_init_.py:
from Article import *
from StockMovementProduct import *
project/my_app/models/Article.py:
from django.db import models
class Article(models.Model):
[...]
project/my_app/models/StockMovementProduct.py:
from django.db import models
from my_app.tools import Synchronizer
class StockMovementProduct(models.Model):
def sync_articles(self):
sync = Synchronizer(self)
[...]
project/my_app/tools/_init_.py is empty
project/my_app/tools/Synchronizer.py:
from my_app.models import Article
from my_app.models import StockMovementProduct
class Synchronizer():
[...]
When i run my code this error is raise:
File "/home/bux/Projets/project/my_app/models/__init__.py", line 7, in <module>
from StockMovementProduct import *
File "/home/bux/Projets/project/my_app/models/StockMovementProduct.py", line 5, in <module>
from my_app.tools import Synchronizer
File "/home/bux/Projets/project/my_app/tools/Synchronizer.py", line 2, in <module>
from my_app.models import StockMovementProduct
ImportError: cannot import name StockMovementProduct
I don't understand why (in Synchronizer.py) Article import work and StockMovementProduct import don't.
In Synchronizer.py i also try:
from my_app.models import Article
from ..models import StockMovementProduct
But without success. What i'm missing with import methodology ?
You have a circular import in your code, namely your StockMovementProduct.py imports Synchronizer.py and yet Synchronizer.py imports StockMovementProduct.py. This is a pretty common problem and there are already a lot of help on that: Circular dependency in Python.
You have a circular import. StockMovementProduct imports Synchronizer, and Synchronizer imports StockMovementProduct.
You need to re structure and maybe move the common dependancies into a 3rd file. It's difficult to suggest a solution though without knowing the content
In my django project I have the following:
apps1/models.py: Post (model)
apps2/models.py: Blogs (model)
apps2/functions.py: get_blogs (method)
The apps1/models.py file imports the Blogs model from apps2/models.py.
The apps2/models.py file imports the get_blogs method from apps2/functions.py.
The apps2/functions.py file import the Post model from apps1/models.py.
I am getting the following error:
ImportError at /
cannot import name Post
Traceback
admin.autodiscover()
<in file apps1/models.py>
from apps2.models import Blogs
<in file apps2/models.py>
from apps2.functions import get_blogs
<in file apps2/functions.py>
from apps1.models import Post
I thought it might be that the admin.autodiscover is importing the Post model first and then through an import loop, it is trying to import it again. Although I tried changing it to:
from apps1.models import Post as OtherPost
but that didn't help. Any idea why this is happening? Is it because there is a loop now?
If the only reason you import Blogs in apps1.models is that you have a relationship field in Post, how about using a lazy relationship instead? As far as I understand, those were designed specifically to deal with import loops like the one you're experiencing.
It is quite easy, instead of
from apps2.models import Blogs
...
class Post(models.Model):
...
my_blog = models.ForeignKey(Blogs)
you use something like this:
class Post(models.Model):
...
my_blog = models.ForeignKey("apps2.Blogs")