由于python manage.py makemigrations
,命令forms.py
大部分时间失败,其中新的模型或新字段在类定义级别被引用。
因此,我必须对每个此类定义进行评论,以便进行迁移。这是一项痛苦的任务。
我不明白迁移过程导致forms.py
模块的原因。我认为导入模型模块应该足够了。
有没有办法避免这些错误?
答案 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()
# ...