迁移与forms.py冲突

时间:2016-09-16 16:14:09

标签: python django django-forms django-migrations

由于python manage.py makemigrations,命令forms.py大部分时间失败,其中新的模型或新字段在类定义级别被引用。

因此,我必须对每个此类定义进行评论,以便进行迁移。这是一项痛苦的任务。

我不明白迁移过程导致forms.py模块的原因。我认为导入模型模块应该足够了。

有没有办法避免这些错误?

4 个答案:

答案 0 :(得分:1)

感谢@alasdair我理解了我的问题并找到了解决方法:我替换了views.py文件中的原始代码

from MyApp import forms

import sys
if 'makemigrations' not in sys.argv and 'migrate' not in sys.argv:
    from MyApp import forms

在我的情况下它运行正常,但我想有一种更好的方法来了解当前进程是否是迁移。如果是这样,请告知。

答案 1 :(得分:1)

我遇到了同样的问题,并发现了具体问题。当调用migrate命令时,Django的系统检查进入了我的forms.py,然后当他们遇到一行代码,该代码对要迁移的表进行查询时,它将失败。我有一个choicefield,它通过这样的数据库查询实例化选择:

university = forms.ChoiceField(
    choices=[('', '')] + [(university.id, university.name) for university in University.objects.all()],
    widget=forms.Select(
        attrs={
            'class': 'form-control',
            'placeholder': 'University',
        }
    ),
    required=True
)

解决方案是从选择中删除查询(将查询保留为[('','')],然后将选择填充到类的init方法中。

class UniversityForm(forms.Form):

    university = forms.ChoiceField(
        choices=[('', '')],
        widget=forms.Select(
            attrs={
                'class': 'form-control',
                'placeholder': 'University',
            }
        ),
        required=True
    )


def __init__(self, *args, **kwargs):
    super(UniversityForm, self).__init__(*args, **kwargs)

    # Load choices here so db calls are not made during migrations.
    self.fields['university'].choices = [('', '')] + [(university.name, university.name) for university in University.objects.all()]

答案 2 :(得分:0)

在查询中以.only排除新列,如下所示:

University.objects.only('id', 'name').all()

然后运行您的迁移。

答案 3 :(得分:0)

我的一种形式的ModelChoiceField也遇到类似的问题。为了能够进行迁移,我不得不注释掉表单代码。

对我来说,解决方案是将所有表单导入移动到views.py中的相应视图方法中。

之前:

from .forms import CalculatorForm

def calculator(request):            
    if request.method != 'POST':
        form = CalculatorForm()
        # ...

之后:

def calculator(request):
    from .forms import CalculatorForm
    if request.method != 'POST':
        form = CalculatorForm()
        # ...