将Django模型属性名称传递给函数

1 投票
3 回答
1375 浏览
提问于 2025-04-15 13:14

我想在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)]

撰写回答