You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中用FileField过滤QuerySet:筛选有无文件的记录

Django中过滤FileField有无文件的QuerySet方法

一、获取FileField未设置文件的记录

Django的FileField未上传文件时,通常会呈现两种状态:字段值为NULL(模型定义了null=True)或空字符串。针对单模型或关联模型,你可以这样过滤:

  • 单模型场景:
from django.db.models import Q

# 同时覆盖NULL和空字符串的情况
SomeModel.objects.filter(Q(filefieldname__isnull=True) | Q(filefieldname=''))
# 如果你的模型确保未上传时字段为NULL,可简化为:
SomeModel.objects.filter(filefieldname__isnull=True)
  • 关联模型场景(如你示例中的entry__relation__filefieldname):
from django.db.models import Q

SomeModel.objects.filter(
    Q(entry__relation__filefieldname__isnull=True) | 
    Q(entry__relation__filefieldname='')
)
# 简化版(若空值仅为NULL)
SomeModel.objects.filter(entry__relation__filefieldname__isnull=True)

二、获取FileField已设置文件的记录

反过来,只需排除未设置文件的记录即可:

  • 单模型场景:
from django.db.models import Q

# 排除所有未设置文件的记录
SomeModel.objects.exclude(Q(filefieldname__isnull=True) | Q(filefieldname=''))
# 简化版(若空值仅为NULL)
SomeModel.objects.filter(filefieldname__isnull=False)
  • 关联模型场景:
from django.db.models import Q

SomeModel.objects.exclude(
    Q(entry__relation__filefieldname__isnull=True) | 
    Q(entry__relation__filefieldname='')
)
# 简化版(若空值仅为NULL)
SomeModel.objects.filter(entry__relation__filefieldname__isnull=False)

关于你之前写法的问题

你之前用exclude(Q(otherfieldname=None) & Q(filefieldname__isnull=True)),这是在排除同时满足otherfieldname为None且filefieldname未设置的记录,并非直接过滤filefield本身的状态,所以达不到预期效果。

内容的提问来源于stack exchange,提问作者Torsten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:50:14