Python Django遗留数据库检查数据库删除_id";字段名的后缀
我在django中为遗留数据库使用inspectdb时遇到问题。我认为我的问题本质上与这里描述的相反: 我数据库中的许多字段名以“\u id”结尾。在运行inspectdb时,以“_id”结尾且也是外键或OneToOneFields的字段将删除“_id”: 我可以通过将上面的行更改为:Python Django遗留数据库检查数据库删除_id";字段名的后缀,python,django,inspectdb,Python,Django,Inspectdb,我在django中为遗留数据库使用inspectdb时遇到问题。我认为我的问题本质上与这里描述的相反: 我数据库中的许多字段名以“\u id”结尾。在运行inspectdb时,以“_id”结尾且也是外键或OneToOneFields的字段将删除“_id”: 我可以通过将上面的行更改为: class AssayClassMap(models.Model): ass_cls_map_id = models.BigIntegerField(primary_key=True) assa
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')
问题在于,每次为该数据库和其他数据库生成模型文件时,都需要手动更改数百个模型文件。我可以想出一个脚本来纠正这些问题,但我想有一些解决办法
谢谢,我解决了这个问题。这是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”后缀为什么会出现此问题?数据库中的字段名仍将包括_id,因为Django会在所有外键后面附加“_id”。当您为这些字段设置值时,您可以设置对象(assay=AssayObject),也可以将值设置为附加了“\u id”(assay\u id=1)的字段名。我相信我现在看到问题可能出在“model\u to\u dict”函数中。输出字典键对应于Django模型字段名(缺少“_id”),而不是数据库字段名我能够解决它!问题出在model_to_dict函数中,而不是django问题
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