如果对象存在,则从对象获取属性

时间:2016-03-30 16:43:01

标签: python django

我经常遇到这种情况,我想知道我是否正确地采取行动。

我想从对象获取属性,但该对象可能是None。

some_value = myobject.some_value if myobject else None

如果变量很短且容易/干净就可以正常工作。

漫长的django查询:

some_value = MyModel.objects.filter(...).first().some_value if MyModel.objects.filter(...).first() else None
理论上,我可以把它分成多行:

myobject = MyModel.objects.filter(...).first()
some_value = myobject.some_value if myobject else None

但这让我觉得过于混乱。

是否有更清洁/更简洁的方法来实现这一目标?

(作为参考,javascript的lodash function可以执行类似的操作)

3 个答案:

答案 0 :(得分:3)

您可以使用getattr

some_value = getattr(MyModel.objects.filter(...).first(), 'some_value', None)

但恕我直言将其分为两行,对你的意图更加清晰明确!

答案 1 :(得分:3)

你可以getattr并提供像这样的默认值

some_value = getattr(myobject, 'some_value', None)

此外,如果只是与模型相关的问题,你可以编写自定义的ModelManager,它将像这样工作

from django.db import models

class GetValueManager(models.Manager):
    def get_value(self, field_name, filter_kwargs=None):
        filter_kwargs = filter_kwargs or {}
        obj = self.filter(**filter_kwargs).first()
        return getattr(obj, field_name, None)

class MyModel(models.Model):
    field1 = models.CharField()

    objects = GetValueManager()

在代码中:

some_value = Mymodel.objects.get_value('some_value', filter_kwargs={'field1': 'foo'}

https://docs.djangoproject.com/en/1.9/topics/db/managers/#adding-extra-manager-methods

答案 2 :(得分:2)

您可以使用try / except方法。

try:
    some_value = MyModel.objects.filter(...).first()...
except AttributeError:
   pass