Django生产环境FieldDoesNotExist报错:pricing无price_per_hour字段
Django迁移报错:pricing.pricing has no field named 'price_per_hour'
生产服务器上重启Django或执行python manage.py makemigrations命令时出现如下错误:
django.core.exceptions.FieldDoesNotExist: pricing.pricing has no field named 'price_per_hour'
price_per_hour字段早已重命名为price,且当时迁移执行正常,但现在每次操作都会触发该错误,导致无法对任何应用的模型进行修改或执行迁移。
已完成的检查
- 执行
python manage.py showmigrations,所有迁移均标记为X,确认所有迁移已完成; - 所有Django应用/类中均未找到或使用
price_per_hour字段,当前Pricing模型代码如下:
class Pricing(models.Model): price = models.DecimalField(default=5,max_digits=10, decimal_places=2) class Meta: ordering = ['-price',] def __str__(self): return "{}".format(self.price)
- 导出当前数据库的SQL,可见表中仅存在
price列,无price_per_hour字段及任何引用:
CREATE TABLE public.pricing_pricing ( id integer NOT NULL, price numeric(10,2) NOT NULL, );
- 尝试将
price字段改回price_per_hour,问题仍未解决。
推测错误源于Django而非PostgreSQL数据库,但无法确定。完整报错栈信息如下:
python manage.py makemigrations Traceback (most recent call last): File "manage.py", line 21, in <module> main() File "manage.py", line 17, in main execute_from_command_line(sys.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped res = handle_func(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 141, in handle loader.project_state(), File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 324, in project_state return self.graph.make_state(nodes=nodes, at_end=at_end, real_apps=list(self.unmigrated_apps)) File "/usr/local/lib/python3.8/site-packages/django/db/migrations/graph.py", line 315, in make_state project_state = self.nodes[node].mutate_state(project_state, preserve=False) File "/usr/local/lib/python3.8/site-packages/django/db/migrations/migration.py", line 87, in mutate_state operation.state_forwards(self.app_label, new_state) File "/usr/local/lib/python3.8/site-packages/django/db/migrations/operations/fields.py", line 326, in state_forwards raise FieldDoesNotExist( django.core.exceptions.FieldDoesNotExist: pricing.pricing has no field named 'price_per_hour'
目前已无其他排查思路,希望得到相关建议或解决方案。
附:曾考虑删除所有迁移文件后重新执行,但由于是生产服务器,担心丢失数据库内容或引发故障,相关命令如下:
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete
内容的提问来源于stack exchange,提问作者wzxecr
相关产品推荐
相关产品推荐

