2

私のdjangoアプリケーションのmodels.pyにこれらのクラスがあります。データベースとしてpostgresql 8.3を使用しています

class Course(models.Model):
    students = models.ManyToManyField(User)
    title = models.CharField(max_length=200)
    description = models.TextField()

    def __unicode__(self):
        return self.title

    class Meta:
        verbose_name_plural="Courses"

class CourseChoicesForm(forms.Form):
    courseoption = forms.ChoiceField(choices=[(x.id,x.title) for x in Course.objects.all()])

実行するpython manage.py syncdbと、次のエラーが表示されますrelation course is not found

...
File "/home/me/Django-1.4/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/home/me/dev/python/django/myprj/myapp/models.py", line 50, in <module>
    class CourseChoicesForm(forms.Form):
  File "/home/me/dev/python/django/myprj/myapp/models.py", line 52, in CourseChoicesForm
    courseoption = forms.ChoiceField(choices=[(x.id,x.title) for x in Course.objects.all()])
...
File "/home/me/Django-1.4/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "myapp_course" does not exist

更新: 私はこれを次のように解決しました

class CourseChoicesForm(forms.Form):
    courseoption = forms.ChoiceField(choices=[],required=False)
    def __init__(self, *args, **kwargs):
        super(CourseChoicesForm, self).__init__(*args, **kwargs)
        self.fields['courseoption'].choices = [(x.id,x.title) for x in Course.objects.all()]

それでも、この動作が発生した理由はよくわかりません。誰か説明してもらえますか?

4

1 に答える 1

3

フォームをmodels.pyファイル内に配置することはお勧めできません。これがまさにその理由です。

実行するにはsyncdb、最初にモデルファイルをロードする必要があります。これは、データベースを更新する前に必ず発生する必要があります。

これで、models.pyファイルにもフォームクラスが含まれ、そのクラス定義は存在するテーブルに依存します。(これはPythonが機能する方法の一部にすぎません。クラス定義は、モジュールのインポート時に実行されます)。したがって、テーブルを追加する前に、テーブルsyncdbが存在する必要があるモジュールをロードする必要がありました。

フォームクラスを変更すると、新しいテーブルに依存する行が移動しました。これは、__init__メソッド内にあります。クラス定義とは異なり、そのメソッドはインポート時に実行されません。実際にフォームオブジェクトを作成したときにのみ実行されます。syncdbこれで、新しいモジュールをインポートしてデータベースを更新でき、すべてが正常に機能します。

于 2012-09-22T04:04:04.023 に答える