0

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

带有_id的Django后缀ForeignKey字段

我的数据库中的许多字段名称以“_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')

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

谢谢

4

1 回答 1

0

我解决了这个问题。这是 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”后缀

于 2020-02-21T22:35:26.640 回答