我可以使用MyModel.objects.filter(othermodel__nr='foo')
查询我的模型。
这很好用。
我想获得该字段的 verbose_name 。
示例:
class OtherModel(models.Model):
nr=models.IntegerField(verbose_name='Number')
在上面的示例中,由于我可以访问OtherModel
,因此很容易,但我希望这样做是通用的。
如何获取“key”中使用的字段的详细名称?
MyModel.objects.filter(**{key: value})
我搜索一个解析双下划线的方法。在此示例中,“othermodel__nr”为(例如)“Number”。
在上面的示例中,我知道引用的模型是OtherModel
。但我搜索适用于任何字符串的解决方案。例如:
MyModel.objects.filter(**{str_containing_three_double_underscores: 'foo'})
我搜索:
get_verbose_name(str_containing_three_double_underscores) --> MyVerboseName
答案 0 :(得分:4)
要处理您对@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)
答案 1 :(得分:1)
我猜你可以这样做,假设filter_key
总是以“model__field”结尾:
from django.contrib.contenttypes.models import ContentType
def get_verbose_name(filter_key):
model = filter_key.split("__")[-2]
field = filter_key.split("__")[-1]
content_type = ContentType.objects.get(model=model)
return content_type.model_class()._meta.get_field(field).verbose_name
答案 2 :(得分:0)
我不明白你为什么需要ORM过滤。如果我正确地得到你的问题,你已经知道了你想要该字段详细名称的类,对吗?
如果是这样,您可以使用ModelName._meta.get_field('field_name').verbose_name
直接获取它,根本不需要使用ORM。