我可以使用查询我的模型MyModel.objects.filter(othermodel__nr='foo')。
这很好。
我想获取该字段的verbose_name。
例:
class OtherModel(models.Model):
nr=models.IntegerField(verbose_name='Number')
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,因为我可以访问OtherModel,所以很容易,但是我想使其通用。
如何获取此处在“键”中使用的字段的详细名称?
MyModel.objects.filter(**{key: value})
我搜索解决双下划线的方法。在此示例中,“ othermodel__nr”改为(例如)“ Number”。
在上面的示例中,我知道引用的模型是OtherModel。但是我搜索了适用于任何字符串的解决方案。例如这样:
MyModel.objects.filter(**{str_containing_three_double_underscores: 'foo'})
Run Code Online (Sandbox Code Playgroud)
我搜寻:
get_verbose_name(str_containing_three_double_underscores) --> MyVerboseName
Run Code Online (Sandbox Code Playgroud)
为了处理您对@MoisésHiraldo的评论,我认为最好在模型的上下文中执行此操作。
from django.db.models.constants import LOOKUP_SEP
from django.core.exceptions import FieldDoesNotExist
from django.utils.encoding import force_text
def get_verbose_name(model, lookup):
# will return first non relational field's verbose_name in lookup
for part in lookup.split(LOOKUP_SEP):
try:
f = model._meta.get_field(part)
except FieldDoesNotExist:
# check if field is related
for f in model._meta.related_objects:
if f.get_accessor_name() == part:
break
else:
raise ValueError("Invalid lookup string")
if f.is_relation:
model = f.related_model
continue
return force_text(f.verbose_name)
get_verbose_name(MyModel, str_containing_three_double_underscores)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
639 次 |
| 最近记录: |