2009-07-28 10 views
1

私はDjangoでクエリーセット内のオブジェクトのセットを繰り返し処理し、任意の属性の値に基づいて何かを実行する関数を作成したいと考えています。オブジェクトの種類は固定です。Djangoモデルの属性名を関数に渡す

class Comment(models.Model): 
    name = models.CharField(max_length=255) 
    text = models.TextField() 
    email = models.EmailField() 

は時々私はname秒以上の機能を実行したいと思うでしょうが、他の回email S:のは、彼らはこのようになりますコメントモデル、からであることを保証しているとしましょう。私はこのようになります関数を記述して呼び出す方法を知りたい:

def do_something(attribute, objects): 
    for object in objects: 
     # do something with the object based on object.attribute 
    return results 

答えて

4
def do_something(attribute, objects): 
    results = [] 
    for object in objects: 
     if hasattr(object, attribute): 
      results.append(getattr(object, attribute)) 
    return results 

あるいは、より簡潔に、

def do_something(attribute, objects): 
    return [getattr(o, attribute) for o in objects if hasattr(o, attribute)] 
+0

+1:getattrルール。 –

1

あなたはあなたの関数から返すようにしたいものを明確にし、その適したreturn文を代用しないでください。 attributeは "名前"、 "テキスト"、または "電子メール"のいずれかに設定されると仮定します。

def do_something(attribute, objects): 
    for o in objects: 
     print getattr(o, attribute) 
    return something 

更新: OK、あなたが質問を更新しました。 Cideの答えは今、最も理にかなっています。あなたは、単一の属性を持つものをやっている場合は

4

、あなたが全体のインスタンス化していないので、よりパフォーマンスである、)(.values_list使用することができますデータベースから使用している特定の値を引き出すだけです。

>>> def do_something(values): 
...  for value in values: 
...   print value 
...  return something 
... 
>>> emails = Comment.objects.values_list('email', flat=True) 
>>> names = Comment.objects.values_list('name', flat=True) 
>>> do_something(emails) # Prints all email addresses 
>>> do_something(names) # Prints all names 
+0

+1ジャンゴー・ソリューションの場合 –

+0

+1マジックポニー! :) – Frozenskys

+0

+1は役に立つ答えと新しいツールですが、私は彼がオブジェクト全体で何かをする必要があります。 –

関連する問題