2009-07-28 71 views
1

我想在Django中構建一個函數,該函數遍歷查詢集中的一組對象,並基於任意屬性的值執行某些操作。對象的類型是固定的;比方說,他們保證是從Comment模型,它看起來像這樣:將Django模型屬性名稱傳遞給一個函數

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

有時我會想這樣做碾過name S中的功能,但其他時間email秒。我想知道如何編寫和調用看起來像這樣的功能:

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規則。 – 2009-07-29 00:23:18

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對於Djangoic解決方案 – 2009-07-28 22:26:22

相關問題