1

私は django カスタム コマンド チュートリアルに従いました。リンクはこちらです。

私の作業ディレクトリは次のようになります。

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は問題を起こしませんが、Unitは問題を起こしません...

2: コマンドラインは実行できませんが、Web サーバーは問題なく実行できます...

4

1 に答える 1

2

あなたのクラスはあなたのクラス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)

もう 1 つの推奨事項: モデルに単数形の名前を付けるのがベスト プラクティスです。Django は自動的にそれらを「複数化」します。Django がクラス名を適切に複数形化できない場合は、モデルのメタに以下を追加して、独自の複数形を指定できます。

class Meta:
    verbose_name_plural = "salaries"
于 2013-03-29T03:12:31.280 に答える