Django Устаревшая база данных inspectdb удаляет суффикс "_id" из имен полей - PullRequest
0 голосов
/ 21 февраля 2020

У меня проблема с использованием inspectdb в django для устаревшей базы данных. Я считаю, что моя проблема, по сути, противоположна описанной здесь:

Django суффикс поля ForeignKey с _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')

Проблема в том, что существуют сотни из них, которые необходимо будет менять вручную каждый раз, когда файл модели генерируется как для этой базы данных, так и для других баз данных. Я могу придумать сценарий для исправления этих проблем, но я хотел бы подумать, что есть какой-то обходной путь.

Спасибо

1 Ответ

0 голосов
/ 22 февраля 2020

Я решил проблему. Это была проблема с функцией 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"

...