Django 查询集过滤器文件字段不为空
Django queryset filter filefield not empty
我正在尝试过滤查询集,以排除没有文件的查询集。我无法让它工作,除非经过无数次迭代。
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 上工作,我不知道那时是否能改变什么。
这里不需要精确:
Something.objects.exclude(file='')
你的字段允许空值,所以我猜那些没有文件的字段为空,而不是空字符串。试试这个:
Something.objects.exclude(file=None)
我认为还有更好的选择:
from django.db.models import Q
Something.objects.filter(~Q(file__isnull=True))
或
Something.objects.exclude(file__isnull=True)
这对我来说非常有效:
objects = MyModel.objects.exclude(
Q(file='')|Q(file=None)
)
https://books.agiliq.com/projects/django-orm-cookbook/en/latest/filefield.html
我认为我们可以使用以下方法直接过滤掉空值:
Something.objects.filter(file__isnull=False)
在filter中,你可以给多个值,但在exclude子句中,你不能给多个值。您必须使用带排除的链接。
有关 Django 过滤器和排除的更多详细信息,您可以参考此 link
我正在尝试过滤查询集,以排除没有文件的查询集。我无法让它工作,除非经过无数次迭代。
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 上工作,我不知道那时是否能改变什么。
这里不需要精确:
Something.objects.exclude(file='')
你的字段允许空值,所以我猜那些没有文件的字段为空,而不是空字符串。试试这个:
Something.objects.exclude(file=None)
我认为还有更好的选择:
from django.db.models import Q
Something.objects.filter(~Q(file__isnull=True))
或
Something.objects.exclude(file__isnull=True)
这对我来说非常有效:
objects = MyModel.objects.exclude(
Q(file='')|Q(file=None)
)
https://books.agiliq.com/projects/django-orm-cookbook/en/latest/filefield.html
我认为我们可以使用以下方法直接过滤掉空值:
Something.objects.filter(file__isnull=False)
在filter中,你可以给多个值,但在exclude子句中,你不能给多个值。您必须使用带排除的链接。
有关 Django 过滤器和排除的更多详细信息,您可以参考此 link