Django ORM:通过过滤器查找获取字段的verbose_name

gue*_*tli 1 django django-orm

我可以使用查询我的模型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)

Sar*_*iev 5

为了处理您对@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)