如何通过详细名称或列名称访问Django模型中的字段名称

时间:2019-05-23 21:29:11

标签: django meta

我有一个模型的详细名称或列名称,我想获取相应的字段名称。我可以使用_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 个答案:

答案 0 :(得分:1)

我同意威廉姆(Willem)的观点,这里存在可靠性和确定性行为方面的问题,但是类似的事情会起作用:

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

答案 1 :(得分:1)

这里可能存在一个问题,即多个字段可以具有相同的 verbose_name,因此它不是一个好的标识符。无论如何,充当冗长名称的任务不是标识符,而是将它们用作documentation says

  

该字段的易读名称。如果未提供详细名称,则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 in (f.name, f.verbose_name, f.db_column)
        )
    except:
        raise KeyError(verbose_name)

但这似乎更成问题,因为现在一个字段的数据库列名称可以等于另一字段的详细名称,这使其变得更加荒谬。

,因此调用:

get_field_from_verbose(Model._meta, 'Test Field')

在找不到此类字段的情况下,它也会引发KeyError

  

用户选中显示详细名称的复选框后,我正在使用该名称访问要在查询中使用的字段名称。

如果这更多是出于用户界面的考虑,则应将字段名称作为复选框的值来攻击,并将详细名称作为“ label”。例如:

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

因此,用户在此处将看到第一个复选框的Verbose fieldname 1,但是如果用户选择了该复选框并单击了提交按钮,则视图将收到fieldname1值,因此该用户的真实姓名该字段。

从本质上讲,这就是Django在使用ModelChoiceField形式时所做的事情:它很好地呈现了项目,但是在幕后,它将主键作为值传递,因此当有人提交主键时表单,我们会收到所选项目的主键,而不是该对象的文本表示形式。