2009-07-28 2 views
1

Я хотел бы построить функцию в Django, которая выполняет итерацию по набору объектов в наборе запросов и делает что-то на основе значения произвольного атрибута. Тип объектов фиксирован; скажем, они гарантированно от модели Комментарий, который выглядит следующим образом:Передача имени атрибута модели Django функции

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

Иногда я хочу сделать запустить функцию над name с, но в других случаях 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 правила. –

1

Вы не ясно, что вы хотите вернуться из вашей функции, поэтому заменить соответствующее return заявление. Я предполагаю, что attribute будет установлен на одно из «имя», «текст» или «письмо».

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

Update: ОК, вы обновили вопрос. Ответ Сайда имеет наибольший смысл.

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 –

+0

+1 для магических пони! :) – Frozenskys

+0

+1 для полезного ответа и нового инструмента, но мне нужно делать что-то с целым объектом. –

Смежные вопросы