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

标签 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 做类似的事情)

最佳答案

您可以执行 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/

相关文章:

python - 如何在 celery 中以编程方式添加/删除 worker ?

Django:无法打开数据库文件(这是路径名问题吗?)

python - 发布到 Django 休息框架

python - 确定异步套接字服务器中客户端的主机名

python - Python中的Web Scraping表数据

Python:在 __init__ 中引发异常是不好的形式吗?

django - 我将如何在我的 Django 模型中创建一个事件/非事件 bool 字段?

python - 无法使用 subprocess.Popen 在 Web 服务中打开 pdf 文件

python - 如何降级numpy?

Django prefetch_related 无法将数据传递给模板