【问题标题】:Django legacy database inspectdb removes "_id" suffix from field namesDjango 遗留数据库 inspectdb 从字段名称中删除“_id”后缀
【发布时间】:2020-06-06 02:42:01
【问题描述】:

我在 django 中为旧数据库使用 inspectdb 时遇到问题。我相信我的问题本质上与这里描述的相反:

Django suffix ForeignKey field with _id

我的数据库中的许多字段名称以“_id”结尾。在运行 inspectdb 时,那些以“_id”结尾并且也是 ForeignKeys 或 OneToOneFields 的字段将删除“_id”:

class AssayClassMap(models.Model):
    ass_cls_map_id = models.BigIntegerField(primary_key=True)
    assay = models.ForeignKey('Assays', models.DO_NOTHING, blank=True, null=True)

我可以通过将上面的行改为这样来解决这个问题:

class AssayClassMap(models.Model):
    ass_cls_map_id = models.BigIntegerField(primary_key=True)
    assay_id = models.ForeignKey('Assays', models.DO_NOTHING, blank=True, null=True, db_column='assay_id')

问题在于,每次为该数据库和其他数据库生成模型文件时,都需要手动更改数百个。我可以想出一个脚本来纠正这些问题,但我想有一些解决方法。

谢谢

【问题讨论】:

  • 为什么会出现这个问题?数据库中的字段名称仍将包含 _id,因为 Django 将“_id”附加到所有外键。当您为这些字段设置值时,您可以将对象设置为 (assay=AssayObject)。或者将值设置为附加“_id”的字段名称 (assay_id=1)。
  • 我相信我现在看到问题可能出在“model_to_dict”函数中。输出字典键对应于 Django 模型字段名称(缺少“_id”)而不是数据库字段名称
  • 我解决了!问题出在 model_to_dict 函数而不是 django 问题

标签: python django inspectdb


【解决方案1】:

我解决了这个问题。这是 model_to_dict 函数而不是 django 函数的问题。我必须根据需要重写 model_to_dict 函数,如下所示:

def custom_to_dict(instance, fields=None, exclude=None):
    opts = instance._meta
    data = {}
    for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
        if not getattr(f, 'editable', False):
            continue
        if fields and f.attname not in fields:
            continue
        if exclude and f.attname in exclude:
            continue
        data[f.attname] = f.value_from_object(instance)
    return data

f.name 的任何实例都已更改为 f.attname。这保留了“_id”后缀

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2011-10-26
    • 2019-07-26
    • 2011-11-21
    • 1970-01-01
    • 2012-10-18
    • 2017-06-12
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多