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表示not
None
值,这种方法比
getattr
myobject
@SardorbekImomaliev,但它更具可读性,尤其是使用长筛选器。尽管使用
.filter
调用不太可能,但这种方法可能会掩盖其他本来会引发的
属性错误。我觉得这是我正在寻找的一行魔法子弹,但我开始同意你和其他人的看法,那就是一条线更干净。