2016-08-14 8 views
0

Djangoの文字列のようなフィルタからフィールドオブジェクトを取得しようとしています。Djangoの文字列パスからモデルフィールドを取得する方法

例えば、モデルSaleと文字列"product__category__name"を考えると

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

、それはCategory.nameのフィールドオブジェクトを取得することは可能でしょうか? (または、具体的には、そのフィールドのverbose_name)。

UPDATEは

これは私が最終的にあなたはあなたがこれらの線に沿って何かを試みることができるobject._meta.get_field('field').verbose_name

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

答えて

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) 

これにより、複数のアプリを持っている場合は、あまりにもアプリの名前を知っている必要がありますが、多分これは、引数として渡すことができるよう、これは難しい得ることができます

名前を返します。

+0

ルックアップ文字列からポイントがカテゴリモデルに到達しています。 – haki

+0

あなたはどのオブジェクトを持っていますか? 'Sale'クラスと' 'product__category__name" '文字列?または、他の何か? – atn

0

を呼び出す必要がありverbose_nameを取得するには

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 
関連する問題