如何重置Django DB? (ValueError:字段 <field> 是通过对 <app.model> 的惰性引用来声明的,但应用程序 <app> 不提供模型 <model>。)

问题描述 投票:0回答:1

问题

我正在使用 Django,在尝试手动修复迁移文件夹后遇到错误。:

ValueError: The field API_Materials.ModelParams.material_param was declared with a lazy reference to 'API_Materials.materialparams', but app 'API_Materials' doesn't provide model 'materialparams'.

models.py
中错误消息中引用的两个类(“MaterialParams”和“ModelParams”)的结构是:

class MaterialParams(models.Model):
    material = models.ForeignKey(Material, models.CASCADE, related_name='params')
    name = models.CharField(max_length=50)
    submitted_by = models.ForeignKey(User, models.SET_NULL, null=True, related_name='material_params')

class ModelParams(models.Model):
    model = models.ForeignKey(Model, models.CASCADE, related_name='params')
    material_param = models.ForeignKey(MaterialParams, models.CASCADE, related_name='model_params')
    submitted_by = models.ForeignKey(User, models.SET_NULL, null=True, related_name='params')
    params = models.JSONField()  # {"x": 10, "z": 40, "output_do_outro" : 30} // {"input": [12, 1, 3.4], "output":}

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['model', 'material_param'], name='unique_model_params')
        ]

尝试

与往常的迁移一样,我尝试注释这些类,创建一个

makemigrations
,然后取消注释,但它不起作用。我还尝试使用“ModelParams”中的约束来注释“material_param”,但结果相同。

在 Stack Overflow 中寻找类似的问题,通常它们与用户相关或由于缺乏“Model.models”继承而相关。后来我删除了数据库服务器中的“ModelParams”表来尝试消除此错误,但没有得到积极的结果。

在某些时候,我尝试删除数据库以重新启动

manage.py flush
,因为数据并不多。但是,我注意到在数据库服务器中应用程序中的表仍然存在,但其他表不存在(例如登录用户)。但是,与问题相关的表(“MaterialParams”和“ModelParams”)不再存在,所以我不知道其他表是否与它相关。

我也尝试运行

manage.py migrate <app> zero
,但该命令给出了相同的错误并且迁移失败。

如何重置数据库(或迁移?)以避免此错误?

django database django-models migration valueerror
1个回答
0
投票

要解决此问题,我需要通过从相应目录中删除迁移文件(“0001_initial,0002_...)来重置迁移,然后通过以下方式进行迁移:

python manage.py makemigrations
python manage.py migrate

但是,因为我从数据库服务器手动删除了“ModelParams”和“MaterialParams”表,所以有必要在

models.py
中注释这些模型(因此在使用这些模型的任何文件中)并使用
--fake
执行迁移不应用它,因为表不再存在:

python manage.py makemigrations
python manage.py migrate --fake

最后,我取消了所有文件中模型的注释并再次迁移,没有

--fake
标志。

© www.soinside.com 2019 - 2024. All rights reserved.