Django查询以过滤和去重。

6
我有一个表格如下:
表名:示例
values
1
1
2

2
3

3

值列表包含上述的值。当我在able表上写一个distinct查询时,我会得到1 2 3和一个空的''值。

我想摆脱null值,因为它在我的程序中造成了一些问题。 我编写的查询如下:

example.objects.values_list('values',flat = True).distinct()

有没有一种方法可以过滤掉那个空值?

抱歉,因为误操作投了反对票,只有在问题被编辑后才能取消投票... - o_c
4个回答

8

试试这个:

from django.db.models import Q
example.objects.exclude(
      Q(values__isnull=True)|Q(values='')
    ).values_list('values', flat=True).distinct()

3

正如其他答案所提到的,如果您有null/空字符串的混淆。您可以使用复杂的查询参数来排除两者,例如:

from django.db.models import Q
example.objects.exclude(Q(values__isnull=True)|Q(values='')).values_list('values',flat = True).distinct()

复杂的查找方法已经出现了...


你必须在 Q 之间使用 | 而不是在其内部。 - Andre Bossard
@FallenAngel:代码现在可以运行了。但是如果我同时使用values_isnull和values,就会出现语法错误。但是当我只使用values = ''时,空值没有显示。感谢您的帮助。 - sankar
@sankar,我已经修正了我的拼写错误,现在你可以使用它了。 - FallenAngel
1
抱歉,我在 Q 的使用上犯了一个错误,现在已经修复了。谢谢 @AndreBossard。 - FallenAngel

1
您可以先尝试过滤掉空值,然后再链接您的筛选器,如下所示。
example.objects.exclude(values=None).values_list('values',flat = True).distinct()

如果您只传递一个字段,也可以传递flat参数。如果为True,则返回的结果将是单个值,而不是元组。示例可以更清楚地说明区别(https://docs.djangoproject.com/en/1.4/ref/models/querysets/#values-list)。 - FallenAngel
我尝试了这段代码,但是我的列表中仍然得到了null值。 - sankar

0
尝试使用is_null字段查找:
example.objects.filter(values__isnull=False).values_list('values',flat = True).distinct()

因此,在.values_list(...之前的查询字符串将返回所有记录,这些记录来自example表,其中values字段不为空。

正如@BurhanKhalid所指出的那样,如果您的values字段是可空的,则此尝试才能起作用。


这是一个好主意,但只有在该字段可以为空时才有效;但从输出结果来看,该字段似乎具有默认值为“”(空字符串)。 - Burhan Khalid
@BurhanKhalid 是的,我的回答是基于那个假设的。 - Serhii Holinei
我尝试了这段代码,但它似乎不起作用。我仍然得到一个包含 null 值的列表。 - sankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接