【问题标题】:Does select_related on an already queryed field perform a SQL query?已查询字段上的 select_related 是否执行 SQL 查询?
【发布时间】:2019-04-23 22:15:39
【问题描述】:

假设汽车有多个轮子,一个轮子只有一种颜色。
第 4 行是否执行 SQL 查询?

cars = Car.objects.prefetch_related('wheel_set__color')
for car in cars:
    for wheel in car.wheel_set:
        print(wheel.color)

【问题讨论】:

    标签: python django django-models orm django-orm


    【解决方案1】:

    你的问题是关于 select_related() 但你的代码指定了 prefetch_related() 所以我会解决这两个问题。

    以下将访问数据库一次:

    cars = Car.objects.select_related('wheel_set__color')
    for car in cars:
        for wheel in car.wheel_set:
            print(wheel.color)
    

    下面会命中数据库3次:

    cars = Car.objects.prefetch_related('wheel_set__color')
    for car in cars:
        for wheel in car.wheel_set:
            print(wheel.color)
    

    但是,以下内容将访问数据库两次:

    cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
    for car in cars:
        for wheel in car.wheel_set:
            print(wheel.color)
    

    https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related

    【讨论】:

    • 感谢您指出没有选择相关的,我实际上忘记了一行:cars = Car.objects.prefetch_related('wheel_set__color') for car in cars: car.select_related('wheel_set') for wheel in car.wheel_set: print(wheel.color)
    • 我不明白你为什么要这么做。您是否打算尽量减少数据库查询的数量?
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多