Как получить доступ к имени поля в модели Django через подробное имя или имя столбца - PullRequest
0 голосов
/ 24 мая 2019

У меня есть подробное имя или имя столбца модели, и я хотел бы получить соответствующее имя поля.Я могу получить доступ ко всем именам полей с помощью _meta ..., но я хочу получить доступ только к конкретному имени поля на основе подробного имени.

Я хочу подключить подробное имя или столбецимя и получить обратно, каково имя поля.Все примеры, которые я нашел, вы можете ввести только имя поля в Model._meta.get_field ('fieldname'), а не подробное имя, чтобы получить любое имя поля.

res = Model._meta.get_field('test_field').verbose_name
res returns  'Test Field'

res = Model._meta.get_field('test_field').name
res returns 'test_field'

ЕслиЯ ввожу подробное имя для ex:

res = Model._meta.get_field('Test Field').name   

Я получаю сообщение об ошибке raise FieldDoesNotExist KeyError" 'Test Field'

Я хотел бы, чтобы вывод был именем поля 'test_field'

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Проблема может заключаться в том, что несколько полей могут иметь одинаковые 1002 * verbose_name, следовательно, это неправильный идентификатор.В любом случае это не задача подробного имени выступать в качестве идентификатора, они используются, как сказано в документации to:

Удобное для восприятия имя дляполе .Если подробное имя не задано, Django автоматически создаст его, используя имя атрибута поля, преобразовав подчеркивания в пробелы.

Мы можем создать функцию, которая делает это, например:

def get_field_from_verbose(meta, verbose_name):
    try:
        return next(f for f in _meta.get_fields() if f.verbose_name == verbose_name)
    except:
        raise KeyError(verbose_name)

Мы можем позволить ему работать с несколькими именами полей, например:

def get_field_from_verbose(meta, verbose_name):
    try:
        return next(
            f for f in _meta.get_fields()
            if f.verbose_name <b>in (f.name, f.verbose_name, f.db_column)</b>
        )
    except:
        raise KeyError(verbose_name)

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

и, таким образом, назовите его с помощью:

get_field_from_verbose(Model._meta, 'Test Field')

Это также повысит KeyError, поскольку такое поле не может быть найдено.

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

Если этоБолее того, ради пользовательского интерфейса, вы должны указать имя поля как значение для флажка, а подробное имя как «label».Например:

<input type="checkbox" name="sel_fields[]" value="<b>fieldname1</b>"><b>Verbose fieldname 1</b><br>
<input type="checkbox" name="sel_fields[]" value="<b>fieldname2</b>"><b>Verbose fieldname 2</b><br>
<input type="checkbox" name="sel_fields[]" value="<b>fieldname3</b>"><b>Verbose fieldname 3</b><br> 

Здесь пользователь, таким образом, увидит Verbose fieldname 1 для первого флажка, но если пользователь выберет этот флажок и нажмет кнопку отправки, представление получит значение fieldname1таким образом, настоящее имя этого поля.

По сути, это то, что делает Django, когда вы, например, используете ModelChoiceField в форме: он представляет элементы красиво, но за занавесками он проходит основнойключ в качестве значения, и, следовательно, когда кто-то отправляет форму, мы получаем первичный ключ выбранного элемента, а не текстовое представление этого объекта.

1 голос
/ 24 мая 2019

Я согласен с Виллемом, что здесь есть проблемы с надежностью и детерминистическим поведением, но что-то вроде этого будет работать:

{field.verbose_name: field for field in model._meta.get_fields()}['Test Field']
...