我正在使用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部分,但我不知道如何通过父级中的字段进行过滤。
答案 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