2016-08-14 62 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) 

這將返回名稱

如果您有多個應用程序,你需要知道應用程序的名稱太這可能會更加困難,但也許這可以作爲參數傳遞英寸