我经常遇到这种情况,我想知道我是否正确地采取行动。
我想从对象获取属性,但该对象可能是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可以执行类似的操作)
答案 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