将Django模型属性名称传递给函数
我想在Django中创建一个函数,这个函数可以遍历一组对象,这些对象来自一个查询集,并根据某个属性的值做一些事情。这些对象的类型是固定的,比如说它们一定是来自Comment模型,模型的结构如下:
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
3 个回答
1
你没有明确说明你希望从函数中返回什么,所以需要换成一个合适的 return
语句。我猜 attribute
会被设置为 "name"、"text" 或 "email" 其中之一。
def do_something(attribute, objects):
for o in objects:
print getattr(o, attribute)
return something
更新:好的,你更新了问题。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
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)]