2013-03-29 2 views
0

Я следил за учебником по пользовательской команде django, ссылка here.Пользовательская команда django жалуется AssertionError: ForeignKey (None) недействителен. почему

Мой рабочий каталог выглядит следующим образом:

myapps/ 
    __init__.py 
    models.py 
    management/ 
     __init__.py 
     commands/ 
      __init__.py 
      my_command.py 
    tests.py 
    views.py 

Мой код выглядит следующим образом:

from django.core.management.base import BaseCommand, CommandError 

class Command(BaseCommand): 

    def handle(self, *args, **options): 
     print '==========' 
     self.stdout.write('Successfully closed poll ttt') 

Когда я запускаю команду manage.py my_command, я получил следующие ошибки,

File "D:/ERP\apps\person\salary\models.py", line 8, in <module> 
    class Salarys(models.Model): 
    File "D:/ERP\apps\person\salary\models.py", line 14, in Salarys 
    Unit = models.ForeignKey(Units, verbose_name = u'def_unit, on_delete = models.PROTECT) 
    File "D:\Python27\Lib\site-packages\django\db\models\fields\related.py", line 910, in __init__ 
    assert isinstance(to, basestring), "%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' 

Очевидно, что первым параметром ForeignKey является моя модель Units, как отключить компилятор жалоба?

ps: моя модель выглядит так: моя модель выглядит так.

class Salarys(models.Model): 
    ''' 
    describe : salary table 
    author : liyang 2013-1-23 
    ''' 
    User = models.ForeignKey(Users, verbose_name = u'account', on_delete = models.PROTECT) 
    Unit = models.ForeignKey(Units, verbose_name = u'def_unit', on_delete = models.PROTECT, null=True) 
    yy = models.IntegerField(u'year) 
    mm = models.IntegerField(u'month') 
    class Meta: 
     db_table = 'users_salarys' 

class Units(models.Model): 
    ''' 
    describe : def unit model 
    author : liyang 2012-12-4 11:45 
    ''' 
    name = models.CharField(u'name',max_length = 20) 
    cname = models.CharField(u'company name',max_length = 20, blank = True, null = True) 
    aname = models.CharField(u'company short cut',max_length = 20, blank = True, null = True)   
    telephone = models.CharField(u'contact',max_length = 20, blank = True, null = True)   
    website = models.CharField(u'website',max_length = 25, blank = True, null = True)   
    address = models.CharField(u'address',max_length = 50, blank = True, null = True)   
    class Meta: 
     db_table = 'units' 

....

странные вещи

1: ForeignKey Пользователь не имеет каких-либо проблем в то время как блок делает ...

2: мой веб-сервер может быть запущен без каких-либо проблем, пока командная строка не может быть запущена ...

+1

Ваша ошибка исходит от models.py и, кажется, не имеет ничего общего с ваша пользовательская команда. Можете ли вы поделиться своими моделями? –

+0

Я считаю, что для вашего внешнего ключа вам нужно указать атрибут null = True. –

+0

спасибо Sidharth Shah, я добавляю null = True в модели, жалоба не исчезает ... – leffe

ответ

0

Ваш класс Units должен быть представлен перед вашим классом Salarys:

class Units(models.Model): 
    ... 

class Salarys(models.Model): 
    user = models.ForeignKey(Users, verbose_name = u'account', on_delete = models.PROTECT) 
    unit = models.ForeignKey(Units, verbose_name = u'def_unit', on_delete = models.PROTECT, null=True) 

Еще одна рекомендация: лучше всего назвать свою модель единственной. Django автоматически «плюрализует» их. Если Django не в множественное число имени класса должным образом, вы можете задать свое собственное множественное число, добавив следующие строки в модели Meta:

class Meta: 
    verbose_name_plural = "salaries" 
+0

Как я мог определить, какая модель на первом месте, если единицы и зарплаты находятся в папке дефферент – leffe

+0

Если 'Units' и' Salarys' находятся в разных файлах 'models.py', то вам нужно убедиться, что вы импортируете свои модели' Units' в файле, где у вас есть модель «Заработная плата». –

+0

спасибо, ваше предложение отлично работает. – leffe

Смежные вопросы