首页 > 解决方案 > 试图在 MAKEEMIGRATONS 期间运行的表单代码

问题描述

我正在尝试设置在本地运行良好的新网站。

但是,当我部署时,我的一种表单中有一些代码会导致问题:

class ProfileForm(forms.ModelForm):
first_name = forms.CharField(max_length=60)
last_name = forms.CharField(max_length=100)
address1 = forms.CharField(max_length=200)
address2 = forms.CharField(max_length=200)
city = forms.CharField(max_length=100)
state = forms.CharField(max_length=100)
zip_code = forms.CharField(max_length=25)

CHOICES = tuple((o.pk, o.name) for o in Allergen.objects.all())
allergens = forms.MultipleChoiceField(choices=CHOICES, required=False)

问题是最后两行。当我尝试进行 MAKEEMIGRATIONS 时,我收到过敏原模型丢失的错误消息。但是,如果我删除这 2 行,则没有问题。

我想,我可以注释掉这些行,然后将它们添加回来。但必须有更好的方法。

如果不尝试运行这些行,我该如何进行 makemigrations?

标签: django

解决方案


我认为最好不要在类定义运行查询。除了进行迁移时的问题外,如果添加新的元组或从数据库中删除一些元组,则不会更新元组。因此,在处理定义类的文件时(通常是在启动 Web 服务器时)运行一次查询,然后使用该值。AllergenAllergen

您可以使用ModelMultipleChoiceField[Django-doc]并使用queryset=…参数 [Django-doc]来获取项目:

class ProfileForm(forms.ModelForm):
    first_name = forms.CharField(max_length=60)
    last_name = forms.CharField(max_length=100)
    address1 = forms.CharField(max_length=200)
    address2 = forms.CharField(max_length=200)
    city = forms.CharField(max_length=100)
    state = forms.CharField(max_length=100)
    zip_code = forms.CharField(max_length=25)
    allergens = forms.ModelMultipleChoiceField(
        queryset=Allergen.objects.all(),
        required=False
    )

这不仅会推迟对象的检索,而且您的表单字段将“理解”模型对象的概念,从而有一种“更丰富”的方式来处理数据。

为了显示正确的名称,您可能必须将模型的__str__方法更新Allergen为:

class Allergen(models.Model):
    # …

    def __str__(self):
        return self.name

推荐阅读