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 回答