Django 3.0 Python 3.* - 嵌套查询和过滤器

Django 3.0 Python 3.* - Nested Queries and Filters

场景:提供值以过滤某些记录的表单。我有 4 个模型 ABCD.

AB

OneToOne 关系

BC

ManyToOne 关系

CD

ManyToOne 关系

给定的表单值是模型D中的一个字段,我要检索的记录是模型A[=18中的一个字段=]

我试过:

records= A.objects.filter(
            a_field = "form_given_value_1",
            B__b_field = C.objects.filter( 
                c_field = D.objects.filter(
                    d_field=form_given_value_2
                )
            )
        )

我收到那个错误:

SyntaxError: keyword argument repeated

然后经过一些搜索我尝试给出答案 :

records = A.objects.filter(
             a_field = "form_given_value_1",
             B__b_field__c_field__d_field = form_given_value_2
          )

它没有给我错误,但它也没有给出记录!..

如何实现该方法?

首先 你需要检查 form_given_value_* 是否为空,因为如果任何一个等于空(无输入),filter() 将 return 没什么

第二个 检查后您需要将过滤器传递给 filter() 检查

我们实现如下:

    from django.db.models import Q

    filters = Q()
    if form_given_value_1:
        filters &= Q(a_field = "form_given_value_1",)
    if form_given_value_2:
        filters &= Q(B__b_field__c_field__d_field = form_given_value_2,)

    records = A.objects.filter(filters)