2016-08-14 43 views
0

我试图从Django中的字符串中获取字段对象。如何从Django中的字符串路径中获取模型字段

例如,

Sale.objects.filter(product__category__name='shoes') 

鉴于模型Sale和字符串"product__category__name",是有可能得到Category.name领域的对象? (或者更具体地说,该字段的verbose_name)。

UPDATE

这就是我最终想出了

from django.db.models.fields import FieldDoesNotExist 

def find_field(model, lookup): 
    lookups = list(reversed(lookup.split("__"))) 
    field = None 

    while model and lookups: 
     current = lookups.pop() 
     field = model._meta.get_field(current) 
     model = field.related_model 
     if lookups and model is None: 
      raise FieldDoesNotExist(lookup) 
    return field 

回答

0

为了得到一个verbose_name你应该叫object._meta.get_field('field').verbose_name

category._meta.get_field('name').verbose_name 
+0

重点是从查找字符串进入类别模型。 – haki

+0

你有哪些物品? 'Sale'类和''product__category__name“'字符串?或者是其他东西? – atn

0

你可以沿着这些路线尝试一些

def get_verbose_name_from_query_string(query_string): 
    query_string = query_string.split('__')[-1].split('_') 
    model_name = query_string[0] 
    field_name = query_string[1] 
    model = apps.get_model('app_name', model_name) 
    return model._meta.get_field(field_name).verbose_name 

query_string = 'product__category_name'  
get_verbose_name_from_query_string(query_string) 

这将返回名称

如果您有多个应用程序,你需要知道应用程序的名称太这可能会更加困难,但也许这可以作为参数传递英寸

相关问题