django的ORM如何在不用调用函数的情况下获取一对一的字段

How does django's ORM get one to one fields without having to call a function

假设我有一个像这样的 django 模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

创建这个一对一字段后,可以通过 user_instance.profile

访问配置文件对象

我已经为 ORM 启用了日志记录,以便在我的 settings.py 文件中查看发送到数据库的查询:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
            'propagate': False,
        },
    },
}

然后我使用 python3 manage.py shell 打开 shell 并执行以下命令:

firstuser = User.objects.first()

这导致以下查询注销:

SELECT "users_user"."id", "users_user"."password", "users_user"."last_login", "users_user"."is_superuser", "users_user"."username", "users_user"."is_staff", "users_user"."is_active", "users_user"."date_joined", "users_user"."name", "users_user"."email", "users_user"."join_date", "users_user"."date_of_birth" FROM "users_user" ORDER BY "users_user"."id" ASC LIMIT 1; args=()

我还做了:

firstuser.profile

并注销此查询:

SELECT "users_profile"."id", "users_profile"."user_id", "users_profile"."status", "users_profile"."institute" FROM "users_profile" WHERE "users_profile"."user_id" = 1 LIMIT 21; args=(1,)

那么,django 如何在我请求相关对象时执行查询 而无需在我自己的代码中调用任何函数.

是否有 python 方法来覆盖如何读取 class 中的属性的行为?

提前致谢!

在 python Descriptors 中让对象自定义属性查找、存储和删除。

底层机制称为 Descriptor Protocol(感谢 Wombatz 指出这一点)

property class 允许动态计算属性

示例:

import random

class MyClass:
    @property
    def random(self):
        return random.random()

my_object = MyClass()

for _ in range(3):
    print(my_object.random)

输出:

0.23871118861024354
0.877585489346098
0.9753110448271668