【问题标题】:filter with select_related on Django在 Django 上使用 select_related 过滤
【发布时间】:2014-03-30 17:15:02
【问题描述】:

我在过滤操作中使用 Django 的 select_related 功能时遇到了问题,这是我的问题,我有三个类:

class A:
   # various fields here

class B(models.model):
   related_A = models.ForeignKey(A)
   related_C = models.ForeignKey(C)
   attribute1 = models.CharField(..)
   # Other attributes

class C(models.model):
   # Attributes

我想要做的是,通过根据另一个参数 attribute1(来自 B 类)在键 related_C 上过滤 B 类来获得 A 类。 为了正确说明,我的 C 类中有一个函数 get_class_A(self)

get_class_A(self,param):
   classes_B = B.objects.filter(related_C = self,attribute1 = param)

它返回一个 B 类的 QuerySet。我想要做的是跟随指向 A 的 ForeignKey,以便将 B 的这个 QuerySet 转换为对象 A 的列表。

我尝试了各种方法,例如:

classes_A = B.objects.select_related('A').filter(related_C = self, attribute1 = param)

还有一些变化,但没有任何效果。有谁知道该怎么做?

谢谢

【问题讨论】:

    标签: django django-queryset django-select-related


    【解决方案1】:
    def get_class_A(self, param):
        return A.objects.filter(b__related_c=self, b__attribute1=param).distinct()
    

    您所描述的内容看起来很像 A 和 C 之间的多对多关系。如果您这样声明,并通过将 B 指定为 through 模型来包含额外的 attributes,Django 将创建两者之间的关系A 和 C 给你。

    另外,select_related() 与过滤结果无关,它只是一个可以让您减少数据库查询次数的工具。来自docs

    这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。

    【讨论】:

    • 就是这样,我正在尝试创建一个多对多关系,但需要额外的参数。我不知道您可以通过模型添加一些额外的属性。我会试试的,我想它会更容易。谢谢!
    • @Kobz:当你声明一个从BA 的外键时,Django 还允许你查询反向关系(从AB)。请参阅Lookups that span relationships 上的文档。我强烈建议您彻底重新阅读文档和教程,否则您可能会遇到很多困惑。
    • 我会这样做的。我开始以一种不完全“未优化”的方式使用 django(添加不必要的查询),现在我正在尝试使用尽可能多的 Django 功能做一些干净的代码,并且有一些我不掌握的概念然而。谢谢你的帮助,你对我很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2019-07-21
    • 2016-01-18
    相关资源
    最近更新 更多