我经常遇到这种情况,我想知道我是否以正确的方式处理它。
我想从一个对象中获取一个属性,但该对象可能是 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 做类似的事情)
最佳答案
您可以执行 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
关于python - 如果对象存在则从对象获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36314869/