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

如何通过详细名称或列名访问Django模型中的字段名,django,meta,Django,Meta,我有一个模型的详细名称或列名,我想得到相应的字段名。通过使用_meta…,我可以访问所有字段名,但我只想基于详细的名称访问特定的字段名 我想插入详细的名称或列名,然后返回字段名。我发现的所有示例都只能在模型中输入字段名。_meta.get_field('fieldname'),而不能输入详细的名称来获取字段名 res = Model._meta.get_field('test_field').verbose_name res returns 'Test Field' res = Model.

我有一个模型的详细名称或列名,我想得到相应的字段名。通过使用_meta…,我可以访问所有字段名,但我只想基于详细的名称访问特定的字段名

我想插入详细的名称或列名,然后返回字段名。我发现的所有示例都只能在模型中输入字段名。_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   
我收到一个错误
raisefielddoesnotexist keyrorm“'testfield'


我希望输出为字段名“test_field”

我同意Willem的观点,即可靠性和威慑行为存在问题,但类似的方法可以奏效:

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

我同意威廉的观点,即可靠性和威慑行为存在问题,但类似的做法会奏效:

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

这里可能存在一个问题,即多个字段可能具有相同的
详细名称
,因此它不是一个好的标识符。详细名称的任务不是充当标识符,而是使用这些字段,例如:

字段的可读名称。如果未给出详细名称,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)
如果找不到这样的字段,它也会引发一个
KeyError


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

如果这更多是为了用户界面,则应将字段名作为复选框的值,将详细名称作为“标签”进行攻击。例如:

<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> 
详细字段名1
详细字段名2
详细字段名3
在这里,用户将看到第一个复选框的
Verbose fieldname 1
,但如果用户选中该复选框并点击提交按钮,视图将收到
fieldname 1
值,因此该字段的真实名称


这就是Django在表单中使用
modelcoocefield
时所做的本质:它很好地呈现项目,但在窗帘后面,它将主键作为值传递,因此当提交表单时,我们会收到所选项目的主键,而不是该对象的文本表示。

在这里,多个字段可能具有相同的
详细名称
,因此它不是一个好的标识符。详细名称的任务不是充当标识符,而是:

字段的可读名称。如果未给出详细名称,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)
如果找不到这样的字段,它也会引发一个
KeyError


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

如果这更多是为了用户界面,则应将字段名作为复选框的值,将详细名称作为“标签”进行攻击。例如:

<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> 
详细字段名1
详细字段名2
详细字段名3
在这里,用户将看到第一个复选框的
Verbose fieldname 1
,但如果用户选中该复选框并点击提交按钮,视图将收到
fieldname 1
值,因此该字段的真实名称


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

问题is表示详细名称本身不是唯一的,因此这比通过字段名获取更“不安全”。在用户选中显示详细名称的复选框后,我将使用该名称访问要在查询中使用的字段名。但是,您应该使用字段名作为复选框的值,使用详细名称作为“标签”。问题是详细名称本身不是唯一的,因此这比通过fieldname获取更“不安全”。在用户选中显示详细名称的复选框后,我将使用该名称访问要在查询中使用的fieldname。但是,您应该使用字段名作为复选框的值,使用详细名称作为“标签”。我必须动态地构建复选框,因为表可能会更改,而且我不知道如何加载值=@Rsnake:即使是动态地,您仍然可以使用字段的真实名称。因此,在模板中可以使用
{{f.fieldname}
。如果您通过AJAX发送这些内容,那么您可以为每个项目创建一个字典,该字典可以传递真实名称和详细名称。谢谢。我会试试。我必须动态地构建复选框,因为表可能会更改,而且我不知道如何加载值=@Rsnake:即使是动态地,您仍然可以使用字段的真实名称。因此,在模板中可以使用
{{f.fieldname}
。如果您通过AJAX发送这些内容,那么您可以为每个项目创建一个字典,该字典可以传递真实名称和详细名称。谢谢。我试试看。杰米,谢谢你帮我解决问题。杰米,谢谢你帮我解决问题。