【问题标题】:Django - Following ForeignKey relationships "backward" for entire QuerySetDjango - 跟踪整个 QuerySet 的 ForeignKey 关系“向后”
【发布时间】:2012-11-10 13:47:59
【问题描述】:

是否可以为整个查询集向后跟踪 ForeignKey 关系?

我的意思是这样的:

x = table1.objects.select_related().filter(name='foo')
x.table2.all()

当 table1 hase ForeignKey to table2.

https://docs.djangoproject.com/en/1.2/topics/db/queries/#following-relationships-backward 我可以看到它只适用于 get() 而不是 filter()

谢谢

【问题讨论】:

    标签: python django postgresql django-queryset


    【解决方案1】:

    你应该可以使用类似的东西:

    for y in x:
    y.table2.all()
    

    但是,在使用查询找到它们之后,您也可以使用 get() 作为唯一值列表(将是 id,除非您有不同的指定)。

    所以,

    x = table1.objects.select_related().filter(name='foo')
    for y in x:
       z=table1.objects.select_related().get(y.id)
       z.table2.all()
    

    应该也可以。

    【讨论】:

    • 当我循环它时 - 我会经常访问数据库,我想避免它。
    • 在这种情况下(您有多个名为 foo 的项目),您应该能够在第二个 for 循环中使用:table1.objects.select_related().get(y.id).table2.all(),这是您可以做的最少工作量在这个框架中,据我所知。
    • 您可能知道,您必须这样做的原因是因为每个foo 可能有不同的table2ForeignKey
    【解决方案2】:

    你基本上想从你开始的数据中获得不同类型的QuerySet

    class Kid(models.Model):
        mom = models.ForeignKey('Mom')
        name = models.CharField…
    
    class Mom(models.Model):
        name = models.CharField…
    

    假设你想让所有妈妈的儿子都叫Johnny

    Mom.objects.filter(kid__name='Johnny')
    

    假设您想要获取任何Lucy 的所有孩子。

    Kid.objects.filter(mom__name='Lucy')
    

    【讨论】:

      【解决方案3】:

      您还可以使用values() 来获取外键引用的特定值。使用values,数据库上的选择查询将减少为仅获取这些值并完成适当的连接。

      重复使用来自 Krzysztof Szularz 的示例:

      jonny_moms = Kid.objects.filter(name='Jonny').values('mom__id', 'mom__name').distinct()
      

      这将使用 Kid QueryManager 返回妈妈属性的字典。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2022-01-22
        • 2021-05-13
        • 1970-01-01
        相关资源
        最近更新 更多