gpt4 book ai didi

python - 查询 Django - 返回其中一个字段不为空的对象

转载 作者:行者123 更新时间:2023-12-01 08:02:05 24 4
gpt4 key购买 nike

使用 Django 1.8

我正在尝试过滤模型,以确定是否仅填充了所选字段之一。如果我有这样的模型,我希望能够对其进行过滤,如下所示。

class MyModel(models.Model):
field_a = models.IntegerField(null=True)
field_b = models.IntegerField(null=True)
field_c = models.IntegerField(null=True)
field_d = models.IntegerField(null=True)
(field_a__isnull=False, field_b__isnull=True, field_c__isnull=True, field_d__isnull=True)
OR
(field_a__isnull=True, field_b__isnull=False, field_c__isnull=True, field_d__isnull=True)
OR
(field_a__isnull=True, field_b__isnull=True, field_c__isnull=False, field_d__isnull=True)
OR
(field_a__isnull=True, field_b__isnull=True, field_c__isnull=True, field_d__isnull=False)

因此,查询集应返回仅填充模型中的一个字段且其余字段为空的所有对象。有没有办法通过 Django 查询来实现这一点?

最佳答案

我能够使用 Q 动态构建它

fields = ['field_a', 'field_b', 'field_c', 'field_d']

q_query = reduce(operator.or_, (
(reduce(operator.and_, (
eval('Q({}__isnull={})'.format(f, False if f == field else True))
for f in fields
)))
for field in fields
))

MyModel.objects.filter(q_query)

这会构建一个 Q 对象,其中 AND 过滤器嵌套在 OR 过滤器中,并对其进行查询

<Q: (
OR: (
AND: ('field_a__isnull', False), ('field_b__isnull', True), ('field_c__isnull', True), ('field_d__isnull', True)
), (
AND: ('field_a__isnull', True), ('field_b__isnull', False), ('field_c__isnull', True), ('field_d__isnull', True)
), (
AND: ('field_a__isnull', True), ('field_b__isnull', True), ('field_c__isnull', False), ('field_d__isnull', True)
), (
AND: ('field_a__isnull', True), ('field_b__isnull', True), ('field_c__isnull', True), ('field_d__isnull', False)
)
)>
<小时/>

编辑

我又看了一遍,并将创建 q_query 更改为不使用 eval()

q_query = reduce(operator.or_, (
(reduce(operator.and_, [
Q(**{'{}__isnull'.format(f): False if f == field else True})
for f in fields
]))
for field in fields
))

关于python - 查询 Django - 返回其中一个字段不为空的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55688253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com