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

时间:2009-07-28 22:12:15

标签: python django

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

3 个答案:

答案 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的答案现在最有意义。

相关问题