【问题标题】:Django filter using Q and multiple fields with different valuesDjango过滤器使用Q和具有不同值的多个字段
【发布时间】:2021-12-08 02:13:53
【问题描述】:

我正在尝试生成满足以下过滤查询的结果:

indicators = request.GET.getlist('indicators[]')
fmrprofiles = FMRPriority.objects.all()
q_objects = Q()
obj_filters = []
for indicator in indicators:
    split_i = indicator.split('_')
    if len(split_i) == 5:
        if not any(d['indicator'] ==  split_i[1] for d in obj_filters):
            obj_filters.append({
                'indicator': split_i[1],
                'scores': []
            })

        for o in obj_filters:
            if split_i[1] == o['indicator']:
                o['scores'].append(int(split_i[4]))

for obj in obj_filters:
    print (obj['scores'])
    q_objects.add(Q(pcindicator__id = int(obj['indicator'])) & Q(score__in=obj['scores']), Q.AND)
print (q_objects)
fmrprofiles = fmrprofiles.values('fmr__id','fmr__road_name').filter(q_objects).order_by('-fmr__date_validated')
print (fmrprofiles.query)

基本上,indicators 是一个列表,例如['indicator_1_scoring_1_5', 'indicator_1_scoring_1_4', 'indicator_2_scoring_2_5']

我想使用以下字段过滤 FMRPriority:

  • 指示符
  • 得分

例如pcindicator 等于 1 并且选择的分数是 5,4..另一个选择 pcindicator 等于 2 并且选择的分数是 3。 查询 q_objects.add(Q(pcindicator__id = int(obj['indicator'])) & Q(score__in=obj['scores']), Q.AND) 返回空集..我也尝试过原始 sql,结果相同。

型号:

class FMRPriority(models.Model):

    fmr = models.ForeignKey(FMRProfile, verbose_name=_("FMR Project"), on_delete=models.CASCADE)
    pcindicator = models.ForeignKey(PCIndicator, verbose_name=_("Priority Indicator"), on_delete=models.PROTECT)
    score = models.FloatField(_("Score"))

【问题讨论】:

    标签: django django-queryset django-filter


    【解决方案1】:

    我通过使用 OR 来解决这个问题并计算 id 的出现然后排除那些不等于过滤器长度的:

    for obj in obj_filters:
        print (obj['scores'])
        q_objects.add(
            (Q(fmrpriority__pcindicator__id = int(obj['indicator'])) & Q(fmrpriority__score__in=obj['scores'])), Q.OR
        )
    
    fmrprofiles = fmrprofiles.values(*vals_to_display).filter(q_objects).annotate(
            num_ins=Count('id'),
            ...
        )).exclude(
            ~Q(num_ins = len(obj_filters))
        ).order_by('rank','road_name') 
    

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 2020-12-25
      • 2019-04-23
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多