How to solve circular import error in django?

I know the error is probably due to a circular import error, but not having a lot of knowledge about it, I cannot fix it. I tried using the methods given in similar questions but couldn't solve it. There are two applications in the project that will consult and main, and I need to import their models into each other,

consult / models.py

from django.db import models
from django.contrib.auth.models import User
from main.models import Customer


class Question(models.Model):
    name = models.ForeignKey(Customer, on_delete=models.CASCADE)
    type = models.CharField(max_length=100, default="SkinCare")
    title = models.CharField(max_length=1000)
    body = models.CharField(max_length=1000000)
    image = models.FileField(blank=True, default=None)
    time = models.DateTimeField()
    deltatime = models.IntegerField(default=0)

    def __str__(self):
        return str(self.time)


class Reply(models.Model):
    name = models.ForeignKey(Question, on_delete=models.CASCADE)
    user = models.ForeignKey(Customer, on_delete=models.CASCADE)
    text = models.CharField(max_length=10000000000)
    like = models.IntegerField(default=0)
    dislike = models.IntegerField(default=0)
    time = models.DateTimeField()
    deltatime = models.IntegerField(default=0)

    def __str__(self):
        return str(self.time)

      

Main / models.py

from django.contrib.auth.models import User
from django.db import models
from consult.models import Question, Reply


class Customer(models.Model):
    name = models.ForeignKey(User, null=True)
    gender = models.CharField(max_length=100)
    skin_type = models.CharField(max_length=1000)
    hair_type = models.CharField(max_length=1000)
    bookmarked = models.ManyToManyField(Question)

    def __str__(self):
        return str(self.name)

      

When I run the application transfer attempt, the following message appears:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\Nikhil Khandelwal\AppData\Local\Programs\Python\Python35-
32\lib\site-packages\django-1.10.4-
py3.5.egg\django\core\management\__init__.py", line 367, in execute_from_
command_line
    utility.execute()
  File "C:\Users\Nikhil Khandelwal\AppData\Local\Programs\Python\Python35-
32\lib\site-packages\django-1.10.4-
py3.5.egg\django\core\management\__init__.py", line 341, in execute
django.setup()
  File "C:\Users\Nikhil Khandelwal\AppData\Local\Programs\Python\Python35-
32\lib\site-packages\django-1.10.4-py3.5.egg\django\__init__.py", line 27, 
in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\Nikhil Khandelwal\AppData\Local\Programs\Python\Python35-
32\lib\site-packages\django-1.10.4-py3.5.egg\django\apps\registry.py", line 
108, in populate
    app_config.import_models(all_models)
  File "C:\Users\Nikhil Khandelwal\AppData\Local\Programs\Python\Python35-
32\lib\site-packages\django-1.10.4-py3.5.egg\django\apps\config.py", line 
199, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\Nikhil Khandelwal\AppData\Local\Programs\Python\Python35-
32\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in 
_call_with_frames_removed
  File "C:\New folder\WebD\zerovey\consult\models.py", line 3, in <module>
    from main.models import Customer
  File "C:\New folder\WebD\zerovey\main\models.py", line 3, in <module>
    from consult.models import Question, Reply
ImportError: cannot import name 'Question'

      

Please answer, assuming I'm new to Django, thank you in Advance :)

+3


source to share


2 answers


Use to='<app_lable>.<Model Name>'

in Foreignkey and ManytoMany fields

Remove import models from file, add foreignkey and manytomany fields to model as below code. to='consult.Question'

When we create the migration from the makemifration command which uses the hardcode model name in the migration file, so use the same way to write Foreignkey and Manytomany field



from django.contrib.auth.models import User 
from django.db import models
class Customer(models.Model): 
    name = models.ForeignKey(User, null=True) 
    gender = models.CharField(max_length=100)
    skin_type = models.CharField(max_length=1000)
    hair_type = models.CharField(max_length=1000)
    bookmarked = models.ManyToManyField(to='consult.Question')

    def __str__(self):
        return str(self.name)

      

+2


source


Try to change the import: in consult / models.py

import main.models.Customer

      

in main / models.py



import consult.models.Question
import consult.models.Reply

      

Then instead of Customer

you use main.models.Customer

and instead of Question

or Reply

you use import consult.models.Question

andconsult.models.Reply

+2


source







All Articles