我正在使用 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
,但该命令给出了相同的错误并且迁移失败。
如何重置数据库(或迁移?)以避免此错误?
要解决此问题,我需要通过从相应目录中删除迁移文件(“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
标志。