【问题标题】:inspectdb command for json in django2 generates django.contrib.postgresql.fields.JSONField instead of django.contrib.postgres.fields.JSONField?django2中json的inspectdb命令生成django.contrib.postgresql.fields.JSONField而不是django.contrib.postgres.fields.JSONField?
【发布时间】:2018-04-09 15:36:42
【问题描述】:

我切换到 django 2 因为它支持使用 inspectdb 检测 json 字段,但是当我运行 inspectdb 时它会生成 django.contrib.postgresql.fields.JSONField 我不知道从哪里导入它。

这里的 django 文档中指定 django_inpectdb_doc

我知道可以通过添加 import django.contrib.postgres.fields.JSONField 来修复它,但问题是它是自动生成的 django.contrib.postgresql.fields.JSONField(注意粗体字)。

class AsyncResultsStore(models.Model):
    task_id = models.CharField(max_length=255)
    created = models.DateTimeField(blank=True, null=True)
    status = models.CharField(max_length=255)
    result = django.contrib.postgresql.fields.JSONField(blank=True, null=True)
    info = models.CharField(max_length=255)
    arguments = django.contrib.postgresql.fields.JSONField(blank=True, null=True)
    chip_meas_result = models.ForeignKey(Chipmeasurementresult, models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'async_results_store'

我想做:

import django.contrib.postgres.fields

但这是不可能的,因为生成的行是:

django.contrib.postgresql.fields

postgressql 代替 postgres

在上面的文档链接中指定我应该放入 settings.py 安装的应用程序:'django.contrib.postgres'

我做到了。

我应该从其他地方导入还是这是 django2 中的错误行为?

如果我确实 import django.contrib 我得到的错误是:

result = django.contrib.postgresql.fields.JSONField(blank=True, null=True)
AttributeError: module 'django.contrib' has no attribute 'postgresql'

【问题讨论】:

  • 我已经为此创建了一张 Django 票证。如果您让我知道您的 GitHub 用户名,我可以在提交消息中注明您,或者如果您愿意,我可以直接说“Erindy on Stack Overflow”。
  • @alasdair 这是我的 github github.com/erindy 我花了很长时间认为这是由于 django 2 升级不当造成的。
  • 好消息是,由于您的问题,它将在下一个 Django 版本 2.0.5 中修复。
  • @alasdair 感谢并乐于贡献,如果您觉得这个问题有用,请考虑投票。

标签: python json django django-2.0 inspectdb


【解决方案1】:

这是 Django 的自省代码中的一个错误。您可以将模型更改为使用django.contrib.postgres.fields,并将import django.contrib.postgres.fields 添加到您的models.py。

此问题将在Django 2.0.5 中由 Django 票证29307 修复。

【讨论】:

  • 这个想法不必手动干预 models.py 文件,因此我可以使用一些 cron 作业自动运行脚本,并使所有 django 项目与数据库保持同步。我正在考虑使用自定义 manage.py 命令来添加这些导入。
  • The docs 说inspectdb 是一种快捷方式,而不是确定的模型生成。即使错误已修复,您仍然需要将import django.contrib.postgresql.fields 添加到模型中。
  • 我明白这一点,这正是我所做的,但我的目标是将 inspectdb 集成到一些部署脚本中,这样我就可以在不手动干预模型的情况下进行部署。为了实现这一点,我添加了一个简单的外部 python 脚本,它添加了“from django.contrib.postgres.fields import JSONField”。在这一点上,我想知道这是否是一种好习惯,因为我认为它没有任何问题。我也同意并理解这是捷径,但如果这成为一个完整的功能,django 不会有更多的功能。
  • 添加导入可能是值得的,只要代码更改不太复杂。然而,它似乎不是 Django 中非常常用的部分 - 花了几个月 after the bug was introduced 直到你遇到它。
  • 来自另一个广泛使用类似功能的 Web 框架,我认为它在 django 中也很有用,因为它允许将遗留数据库轻松插入 django 应用程序。 inspectdb 已经规定只需要提高可靠性,因为它会为微服务和其他集成中的有趣机会开辟道路。除非有其他工具可以实现我不知道的 inpectdb。
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2022-01-27
相关资源
最近更新 更多