如何在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
相关产品推荐
相关产品推荐

