我有一个模型的详细名称或列名称,我想获取相应的字段名称。我可以使用_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”
答案 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
形式时所做的事情:它很好地呈现了项目,但是在幕后,它将主键作为值传递,因此当有人提交主键时表单,我们会收到所选项目的主键,而不是该对象的文本表示形式。