2

我在过滤操作中使用 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)

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

谢谢

4

1 回答 1

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

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

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

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

于 2014-02-27T10:41:39.033 回答