繁体   English   中英

在Django上使用select_related进行过滤

[英]filter with select_related on Django

我在过滤器操作中使用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。我要做的是跟随ForeignKey指向A,以便将该B的QuerySet转换为对象A的列表。

我尝试了各种事情,例如:

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

和一些变化,但无济于事。 有谁知道该怎么做?

谢谢

def get_class_A(self, param):
    return A.objects.filter(b__related_c=self, b__attribute1=param).distinct()

您所描述的内容看起来很像A与C之间的ManyToMany关系。如果这样声明,并通过将B指定为直通模型来包含额外的attributes ,则Django会为您创建A与C之间的关系。

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

这可以提高性能,从而导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM