【问题标题】:Django - Filter queryset with child objects (ForeignKey)Django - 使用子对象(外键)过滤查询集
【发布时间】:2015-02-09 19:22:21
【问题描述】:

我有3个Model,其中2个对应第一个。

class Parent(models.Model):
    name = models.CharField....
    ...

class Child1(models.Model):
   parent = models.ForeignKey(Parent)
   ...

class Child2(models.Model):
   parent = models.ForeignKey(Parent)
   ...

现在,在我看来,我有 2 个过滤了 Child1Child2 对象的查询集。

有没有办法检索过滤后的查询集中的所有 Parent 对象?

类似...

children1 = Child1.objects.filter(blah=blah)
children2 = Child2.objects.filter(blah=blah)
parents = Parent.objects.filter(self__in=children1 or self__in=children2)

注意上面的代码根本不起作用,这只是想法。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    是的:

    from django.db.models import Q
    
    children1 = Child1.objects.filter(blah=blah)
    children2 = Child2.objects.filter(blah=blah)
    parents = Parent.objects.filter(Q(child1__in=children1) | Q(child2__in=children2))
    

    查看文档:

    【讨论】:

    • 我猜 Q 对象会帮助我,但是,是否有必要在 children1 和 children2 查询集中使用 value list value 才能使其工作?
    • Q 对象是必需的,因为您希望在过滤器中使用 OR 查询...如果您想要 AND 查询,那么您可以将多个 kwargs 传递给 @987654331 @方法
    • 您当然可以通过将FK字段上的related_nameChild1Child2模型设置回Parent来自定义查找名称,否则默认为小写的模型名称为以上
    • 不,子查询的值列表或值 qs 不是必需的,只要您只想按主键 id 进行选择... Django 将为您派生,如示例中所示在docs.djangoproject.com/en/2.2/ref/models/querysets/#in
    【解决方案2】:

    1- 为您的子模型添加一个相关名称:

    class Parent(models.Model):
        name = models.CharField....
        ...
    
    class Child1(models.Model):
       parent = models.ForeignKey(Parent, related_name='related_Child1')
       title1 =  models.CharField(max_length=30)
       ...
    
    class Child2(models.Model):
       parent = models.ForeignKey(Parent, related_name='related_Child2')
       title2 =  models.CharField(max_length=30)
    

    2- 在视图模块中导入“Q 查找”:

        from django.db.models import Q
    

    3-然后在您的视图中,您可以使用以下过滤器:

        search_words = "test_word"
        chaild1_search = Child1.objects.filter(Q(title1__icontains=search_words))
        chaild2_search = Child2.objects.filter(Q(title2__icontains=search_words))
    
        queryset_list_parent = Parent.objects.filter(Q(related_Child1__in=chaild1_search )|
                                              Q(related_Child2__in=chaild2_search)
                                              ).distinct()
    

    我希望这对你有帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2020-06-22
      • 2021-09-21
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多