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
假设我有一个像这样的 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