Python 如果对象存在,则从对象获取属性
我经常遇到这种情况,我想知道我的做法是否正确 我想从对象中获取属性,但该对象可能没有属性Python 如果对象存在,则从对象获取属性,python,django,Python,Django,我经常遇到这种情况,我想知道我的做法是否正确 我想从对象中获取属性,但该对象可能没有属性 some_value = myobject.some_value if myobject else None 如果变量的长度较短且易于键入/清除,则此操作非常有效 这会让django查询变得混乱: some_value = MyModel.objects.filter(...).first().some_value if MyModel.objects.filter(...).first() else N
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有一个类似的方法)您可以使用try/except方法
try:
some_value = MyModel.objects.filter(...).first()...
except AttributeError:
pass
您可以使用:
但是,我认为把它分成两行是非常清晰和明确的你的意图 您可以执行
getattr
并提供如下默认值
some_value = getattr(myobject, 'some_value', None)
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()
此外,如果这只是模型相关的问题,您可以编写自定义ModelManager,它将像这样工作
some_value = getattr(myobject, 'some_value', None)
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'}
您可以使用try/except.Why not just
my_object=MyModel.objects.filter(some_value=however\u您可以检查_value)。首先()如果my_object:#做您的事
只需将它分成多行,如果感觉混乱,在前后添加换行符即可。我认为这是最具可读性的解决方案。与其尝试将所有内容都放在一行,为什么不使用传统的if/else块呢?在这种情况下,您总是只在MyModel
上查询吗?如果尝试失败,是否会将某些值设置为None?您在块中将some\u值设置为None,除了块。如果在中有50/50表示notNone
值,这种方法比getattr
慢myobject
@SardorbekImomaliev,但它更具可读性,尤其是使用长筛选器。尽管使用.filter
调用不太可能,但这种方法可能会掩盖其他本来会引发的属性错误。我觉得这是我正在寻找的一行魔法子弹,但我开始同意你和其他人的看法,那就是一条线更干净。