【问题标题】:Django Prefetch related_name not visible when using multiple lookup使用多个查找时,Django Prefetch related_name 不可见
【发布时间】:2019-03-03 21:26:04
【问题描述】:

当我在多个字段上使用 django Prefetch 对象 (https://docs.djangoproject.com/en/2.2/ref/models/querysets/#prefetch-objects) 时:

model_a.objects.prefetch_related(Prefetch(model_b__model_c), to_attr='data')

其中 model_a 与 model_b 具有 m2m 关系,而 model_c 具有 model_b 的外键。 我似乎没有在返回的 QuerySet 的元素上获得“数据”字段。

我是不是找错地方了?

【问题讨论】:

    标签: django database


    【解决方案1】:

    首先,根据您描述的关系,Prefetch 对象需要像这样构造(除非您为关系定义了 related_name,在这种情况下,您需要相关名称而不附加 @ 987654323@):

    Prefetch('model_b_set__model_c_set')
    

    其次,你实际上是在做两个预取:

    • 第一个为每个model_a 获取所有model_b 实例。
    • 第二个获取每个model_b 的所有model_c 实例。

    data 是为第二次预取定义的,即。在model_b 实例上,而不是在model_a 上,它将包含model_c 实例的列表。所以你可以这样访问它:

    a_models = ModelA.objects.prefetch_related(
        Prefetch('model_b_set__model_c_set'), 
        to_attr='data')
    for a in a_models:
        for b in a.model_b_set.all():
            b.data # => contains a list of model_c instances
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2013-09-14
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多