如何使用Q对象和&运算符对queryset的值进行筛选查询?

2024-10-02 10:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

你能支持我提出以下问题吗?你知道吗

我有这样的模型:

class Tarifa(models.Model):
    limite_i = models.DecimalField(max_digits=10, decimal_places=2)
    limite_s = models.DecimalField(max_digits=10, decimal_places=2)


class Calculator(models.Model):
    tarifa = models.ForeignKey(Tarifa, on_delete=models.CASCADE)
    base = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    limite = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

我有一个第一个查询集,它提供了计算器模型中一行的信息:

qsl1 = Calculator.objects.values_list('base')

此查询集返回我在基中的所有金额:

<QuerySet [(Decimal('3000.00'),), (Decimal('5000.00'),), (Decimal('1000.00'),)]>

稍后,我将此查询作为子查询输入以下查询集中:

qsl2 = Tarifa.objects.filter(
Q(limite_s__gte=qsl1) 
& Q(limite_i_isr__lte=qsl1))
.values_list('limite_i')

这第二个查询的值是'limit\u s'>;='base'和'limit\u i'<;='base',然后给我带来'limit\u i'的值

现在的问题是,我只返回第一个值3000.00的比较,我还需要对5000.00和1000.00以及所有其他添加的值进行比较。你知道吗

但我不知道你怎么能支持我,非常感谢。你知道吗


Tags: 模型truebasemodelsmaxclassdecimallimit
2条回答

如果用^{}更新ForeignKey字段,如下所示:

class Calculator(models.Model):
    tarifa = models.ForeignKey(Tarifa, on_delete=models.CASCADE, related_name='calculators')
    base = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    limite = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

然后你可以这样尝试:

Tarifa.objects.filter(Q(limite_s__gte=F('calculators__base'))&Q(limite_i__lte=F('calculators__base')))

当您只需要一个字段时,我建议使用属性flat调用values\u list。你知道吗

bases = Calculator.objects.values_list('base', flat=True)

这将返回queryset的展开版本:

<QuerySet [Decimal('3000.00'), Decimal('5000.00'), Decimal('1000.00')]>

在获取基之后,您应该创建一个Q对象,其中包含或查询如下:

import operator
from itertools import reduce

query_args = []
for base in bases:
    query_args.append(
        Q(limite_s__gte=base) & Q(limite_i__lte=base)
    )

query = reduce(operator.or_, query_args)

tarifas = Tarifa.objects.filter(query).values_list('limite_i', flat=True)

相关问题 更多 >

    热门问题