Как вы заказываете модели с отношениями M2M, чтобы избежать ошибок NameSpace? - PullRequest
0 голосов
/ 19 февраля 2010

Я не могу понять, как я должен упорядочить эти модели, имеющие отношения M2M.

Когда я пытаюсь синхронизировать базу данных, я не могу, потому что связанная с моделью модель не находится в пространстве иментем не менее, поэтому я получаю:

NameError: имя 'FavoriteQuestion' не определено

Если я поменяюсь местами, я получу:

NameError: имя 'UserProfile' не определено

class UserProfile(models.Model):  
    """User Profile customizations"""  
    user = models.ForeignKey(User, unique=True)  
    favorite_questions =  models.ManyToManyField(Question, through=FavoriteQuestion,  
                                                 related_name='favorited_by')  
    badges = models.ManyToManyField(Badge, through=Award,  
                                    related_name='awarded_to')  


class FavoriteQuestion(models.Model):  
    """A favorite Question of a User."""  
    question      = models.ForeignKey(Question)  
    user          = models.ForeignKey(UserProfile, related_name='user_favorite_questions')  
    added_at = models.DateTimeField(default=datetime.datetime.now)

Вот TraceBack:

$ python manage.py syncdb   
    Traceback (most recent call last):   
      File "manage.py", line 11, in <module>   
        execute_manager(settings)   
      File "/usr/local/lib/python2.6/site-packages/django/core/management/__init__.py", line 439, in execute_manager   
        utility.execute()   
      File "/usr/local/lib/python2.6/site-packages/django/core/management/__init__.py", line 380, in execute   
        self.fetch_command(subcommand).run_from_argv(self.argv)   
      File "/usr/local/lib/python2.6/site-packages/django/core/management/base.py", line 195, in run_from_argv   
        self.execute(*args, **options.__dict__)   
      File "/usr/local/lib/python2.6/site-packages/django/core/management/base.py", line 221, in execute   
        self.validate()   
      File "/usr/local/lib/python2.6/site-packages/django/core/management/base.py", line 249, in validate   
        num_errors = get_validation_errors(s, app)   
      File "/usr/local/lib/python2.6/site-packages/django/core/management/validation.py", line 28, in get_validation_errors   
        for (app_name, error) in get_app_errors().items():   
      File "/usr/local/lib/python2.6/site-packages/django/db/models/loading.py", line 131, in get_app_errors   
        self._populate()   
      File "/usr/local/lib/python2.6/site-packages/django/db/models/loading.py", line 58, in _populate   
        self.load_app(app_name, True)   
      File "/usr/local/lib/python2.6/site-packages/django/db/models/loading.py", line 74, in load_app   
        models = import_module('.models', app_name)   
      File "/usr/local/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module   
        __import__(name)   
      File "/Users/Bryan/work/APPNAME/forum/models.py", line 434, in <module>   
        class FavoriteQuestion(models.Model):   
      File "/Users/Bryan/work/APPNAME/forum/models.py", line 437, in FavoriteQuestion   
        user          = models.ForeignKey(UserProfile, related_name='user_favorite_questions')   
    NameError: name 'UserProfile' is not defined   

Ответы [ 2 ]

0 голосов
/ 04 марта 2016

Вместо того, чтобы передавать класс в конструктор поля, передайте строку имени класса. Django сделает всю работу по выяснению того, как подключить модели, не полагаясь на определения классов, которые существуют в той точке модуля, где определяется другой класс. Я бы сделал это для всех ваших отношений, которые вы определили:

class UserProfile(models.Model):  
    """User Profile customizations"""  
    user = models.ForeignKey('User', unique=True)  
    favorite_questions =  models.ManyToManyField('Question', through='FavoriteQuestion',  
                                                 related_name='favorited_by')  
    badges = models.ManyToManyField('Badge', through='Award',  
                                    related_name='awarded_to')  


class FavoriteQuestion(models.Model):  
    """A favorite Question of a User."""  
    question = models.ForeignKey('Question')
    user = models.ForeignKey('UserProfile', related_name='user_favorite_questions')  
    added_at = models.DateTimeField(default=datetime.datetime.now)
0 голосов
/ 19 февраля 2010

Вам не нужно создавать поле favourite_question в профиле пользователя.

Пока с каждым FavouriteQuestion связан пользователь, API экземпляра модели предоставит вам доступ к списку любимых вопросов для пользователя.

...