Django复杂查询父级

时间:2018-05-02 16:46:51

标签: django django-models django-queryset

我正在使用django,我在确定如何处理数据库的复杂查询时遇到了一些麻烦。我有两个模型:

父:

id = models.AutoField(primary_key = True)
name = models.CharField(max_length = 60)
parent = models.ForeignKey(Parent, on_delete = models.CASCADE)

儿子:

explicit

基本上,我有一个带有sons查询集的对象,我需要通过父类的某些类别过滤此查询集。例如,过滤父类别为9,10或11的所有儿子。

我知道如何使用Q来执行OR部分,但我不知道如何通过父级中的字段进行过滤。

3 个答案:

答案 0 :(得分:3)

尝试类似的东西:

sons = Son.objects.filter(parent__category__in = [9, 10, 11]).select_related('parent')

您必须使用__(双下划线)才能访问ForeignKey model's字段。

答案 1 :(得分:1)

Django提供了一种强大而直观的方式来“跟踪”查找中的关系 请使用django.db.models中的Q来尝试此操作 Official Django Documentation

Son.objects.filter(Q(parent__cateogory__id='') | Q(parent__cateogy__name=''))

答案 2 :(得分:1)

您不必使用Q进行此类查询。我实际上建议保持这个简单,如 zen of Python 中所述。

如果你想要那些父母属于类别9,10和11的Son个对象(因为你有一个Categories模型,我会认为Categories模型有一个字段number具有相应的类别编号),执行此查询:

sons = Son.objects.filter(parent__category__number__in=[9,10,11])

但有一点需要注意,如果你必须在parent Queryset中获取每个Son对象的sons个对象(这里是第一个Son对象),那么你有执行sons.first().parent使用一个或多个查询命中数据库,因为Queryset被懒惰地评估。

为了防止这种情况发生,从根本上保持数据库命中率有限,请执行以下查询(仅当您确定需要parent Son sons = Son.objects.filter(parent__category__number__in=[9,10,11]).select_related('parent') 的对象时才能执行以下操作:

parent

这将为Son中的每个sons Queryset对象预先填充Categories

  

此外,模型名为单数,因此我建议将Category更改为5 5 $ ? 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0