Автоматическое решение для «Добавить аргумент related_name в определение для« XXX ».»? - PullRequest
1 голос
/ 15 марта 2011

Я подключаю Django к существующей системе. Мне дали устаревшую схему, и я должен работать с ней.

Я сгенерировал модели с inspectdb, но получаю сотни:

ABC>DEF: Accessor for field 'HIJ' clashes with related field 'KLM'. Add a related_name argument to the definition for 'HIJ'.

У меня не было бы проблемы с этим, если бы это было только небольшое число. Но это не так.

Есть ли автоматический способ исправить это, добавив уникальные related_name s?

РЕДАКТИРОВАТЬ: Для разъяснения, я действительно ищу автоматическое решение проблемы, а не то, которое требует редактирования каждого поля вручную.

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Если вам не нужно связанное имя, вы можете установить его на "+" .

Если вы не хотите полностью отключать их или не можете использовать "+"в вашей версии django (я не помню, когда она была добавлена), вы можете использовать что-то вроде следующего:

_no_related_name_counter = 0
def no_related_name():
    _no_related_name_counter += 1
    return "_norn_%%(class)s_%i" % _no_related_name_counter

ForeignKey(..., related_name=no_related_name())

Но если вы вставляете связанные имена с помощью поиска и замены регулярного выражения, вы также можетеустановите их на что-то читаемое, например, замените (\s*(\w+)\s*=\s*models\.ForeignKey\(.*)\)(\s*)$ на $1, related_name="%(class)s_$2_reverse")$3

1 голос
/ 15 марта 2011

Вы должны проверить отношения внешнего ключа, указав related_name, например:

user = models.ForeignKey(User, related_name='user')
admin = models.ForeignKey(User, related_name='user1') #you need to use a different related_name here

Надеюсь, это поможет.

0 голосов
/ 18 октября 2018

Иногда я оказываюсь в такой ситуации.Модификация inspectdb работала для меня в нескольких случаях, но я не могу обещать, что это будет уместно в любой ситуации.Вот что я сделал:

    #Original inspectdb
    121                         if rel_to in known_models:
    122                             field_type = 'ForeignKey(%s' % rel_to
    123                         else:
    124                             field_type = "ForeignKey('%s'" % rel_to

    #Modified inspectdb
    121                         if rel_to in known_models:
    122                             field_type = 'ForeignKey(%s' % rel_to
    123                         else:
    124                             field_type = "ForeignKey('%s'" % rel_to
    125                         extra_params['related_name'] = '%s_%s' % (table2model(table_name),column_to_field_name[column_name])

Это автоматически добавит аргумент related_name к каждой сгенерированной модели, которая вряд ли столкнется с другими.Опять же, это зависит от ситуации, но эта однострочная модификация сэкономила мне массу работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...