我想在Django中构建一个函数,它迭代查询集中的一组对象,并根据任意属性的值执行某些操作。对象的类型是固定的;让我们说它们保证来自Comment模型,看起来像这样:
class Comment(models.Model):
name = models.CharField(max_length=255)
text = models.TextField()
email = models.EmailField()
有时我会想要在name
s上运行该功能,但有时候email
s。我想知道如何编写和调用看起来像这样的函数:
def do_something(attribute, objects):
for object in objects:
# do something with the object based on object.attribute
return results
答案 0 :(得分: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)]
答案 1 :(得分: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
答案 2 :(得分:1)
您无法明确要从函数返回的内容,因此请使用合适的return
语句替换。我假设attribute
将设置为“name”,“text”或“email”之一。
def do_something(attribute, objects):
for o in objects:
print getattr(o, attribute)
return something
更新:好的,您已更新了问题。 Cide的答案现在最有意义。