1

J'ai deux classes qui importent les uns des autres:importation circulaire est que l'arrêt de commande Django, shell ou non réponse web

profil/models.py

class Company(models.Model): 
    name = ... 

class CompanyReview(models.Model): 
    company = models.ForeignKey(Company) 
    from action.models import CompanyAction 
    action = models.ForeignKey(CompanyAction) 

action/models.py

from profile.models import Company 
class CompanyAction(models.Model): 
    company = models.ForeignKey(Company, null = True, blank = True) 

L'importation circulaire fonctionne lorsque l'application Django est exécutée sur le serveur ou lorsque j'appelle vie w fonctionne dans le shell. Cependant, lorsque j'importe une des classes, la commande Django échouera avec une erreur (voir Traceback ci-dessous).

Pourquoi est-ce le cas et seulement causer un problème dans le command method? Comment puis-je éviter l'erreur? J'ai essayé une importation paresseuse de la classe CompanyAction, mais cela a conduit au même message d'erreur.

ne fonctionne pas alternatif:

class CompanyReview(models.Model): 
    company = models.ForeignKey(Company) 
    from django.db.models import get_model 
    _model = get_model('action', 'CompanyAction') 
    action = models.ForeignKey(_model) 

Fait intéressant, la _model variable est vide si j'exécute ma fonction de commande et les classes sont importées. Lorsque je charge ./manage.py shell, la variable contient le nom de classe correct. Pourquoi est-ce le cas?

Traceback

(virtual-env)PC:neurix$ python manage.py close_action 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 453, in execute_from_command_line 
    utility.execute() 
    File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 272, in fetch_command 
    klass = load_command_class(app_name, subcommand) 
    File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 77, in load_command_class 
    module = import_module('%s.management.commands.%s' % (app_name, name)) 
    File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
    File "/Users/Development/project/apps/action/management/commands/close_action.py", line 2, in <module> 
    from action.models import CompanyAction 
    File "/Users/Development/project/apps/action/models.py", line 26, in <module> 
    from profile.models import Company 
    File "/Users/Development/apps/profile/models.py", line 436, in <module> 
    class CompanyReview(models.Model): 
    File "/Users/Development/project/apps/profile/models.py", line 446, in CompanyReview 
    action = models.ForeignKey(_model) 
    File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/db/models/fields/related.py", line 993, in __init__ 
    assert isinstance(to, six.string_types), "%s(%r) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string %r" % (self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT) 
AssertionError: ForeignKey(None) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self' 

Répondre

1

Django dispose d'un système d'arrêt des importations circulaires sur les clés étrangères détaillées ici: https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

Vous voulez faire quelque chose comme:

class CompanyReview(models.Model): 
    company = models.ForeignKey(Company) 
    action = models.ForeignKey('action.CompanyAction') 

class CompanyAction(models.Model): 
    company = models.ForeignKey('profile.Company', null = True, blank = True) 
+0

Salut Jeff, Merci pour votre réponse! Votre suggestion fonctionne. Savez-vous pourquoi cela n'a jamais causé de problème lors de l'exécution du site via le serveur web et que l'erreur est apparue uniquement via la commande? – neurix

+1

Je n'ai aucune idée désolé :(J'ai toujours pensé qu'il aurait échoué lors de l'exécution du serveur Web ainsi –

Questions connexes