Django 查询集过滤器文件字段不为空

Posted

技术标签:

【中文标题】Django 查询集过滤器文件字段不为空【英文标题】:Django queryset filter filefield not empty 【发布时间】:2015-05-18 08:44:57 【问题描述】:

我正在尝试过滤查询集,以排除没有文件的查询集。而且我无法让它工作,除非通过无数次迭代。

class Something(models.Model):
    name = models.CharField(max_length=512)
    file = models.FieldField(upload_to="files", null=True, blank=True)

然后,得到一个有文件的

 # this give me all objects
 Something.objects.exclude(file__exact='')
 
 # this is a valid solution, but hell, something easier should exist, 
 something_with_files = set()
 for s in Something.objects.all():
    if s.file:
        something_with_files.add(s)

解决这个问题的真正方法是什么?

PS:在 PostGres 上工作,我不知道那是否能改变任何事情。

【问题讨论】:

当您说file = models.FieldField(... 时,您的意思是file = models.FileField(...FieldField 在 Django 中不存在。 【参考方案1】:

我认为我们可以使用以下方法直接过滤掉空值:

Something.objects.filter(file__isnull=False)

在过滤器中,您可以给出多个值,但在排除子句中,您不能给出多个值。您必须使用带有排除的链接。

有关 Django 过滤器和排除的更多详细信息,您可以参考link

【讨论】:

【参考方案2】:

这对我来说非常有效:

objects = MyModel.objects.exclude(
    Q(file='')|Q(file=None)
)

https://books.agiliq.com/projects/django-orm-cookbook/en/latest/filefield.html

【讨论】:

【参考方案3】:

我认为还有更好的选择:

from django.db.models import Q    

Something.objects.filter(~Q(file__isnull=True))

Something.objects.exclude(file__isnull=True)

【讨论】:

是的,以下两种方式呈现相同的 count(): (1) 使用 django.db.models.Q 对象和排除过滤器 ~Q() (2) 使用 .exclude () 与 isnull=True。也就是当开篇提到的模型中 null=True 和 blank=True 时【参考方案4】:

您的字段允许空值,所以我猜那些没有文件的字段为空,而不是空字符串。试试这个:

Something.objects.exclude(file=None)

【讨论】:

【参考方案5】:

这里不需要精确:

Something.objects.exclude(file='')

【讨论】:

如果它对其他人有用,我还必须使用Something.object.exclude(Q(file='') | Q(file__exact=None)) 排除file__exact=None

以上是关于Django 查询集过滤器文件字段不为空的主要内容,如果未能解决你的问题,请参考以下文章

从组合框中过滤查询(为 Null 且不为空)

Django 查询集过滤,将字段与字段进行比较

如果字段存在,Django过滤查询集

django - manytomany 上的查询过滤器为空

根据 Django 国家/地区字段过滤查询集

构建请求 URL 以通过同一字段多次过滤 Django 查询集