Django ORM:通过过滤器查找

时间:2016-10-21 12:27:29

标签: django django-orm

我可以使用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

3 个答案:

答案 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。