django QuerySet 过滤器()

Posted

技术标签:

【中文标题】django QuerySet 过滤器()【英文标题】:django QuerySet filter() 【发布时间】:2014-07-13 15:11:55 【问题描述】:

我有一个这样的模型

class File(models.Model):

    folder=models.ForeignKey(Folder, null=True, blank=True)
    uploaded_file=models.FileField(upload_to=get_upload_path)
    pub_date = models.DateTimeField('date published',default=timezone.now())
    tag=models.ManyToManyField(FileTag)
    notes=models.TextField(max_length=200)
    uploader=models.ForeignKey(User)

    def __unicode__(self):
        return str(self.uploaded_file)
    #return os.path.basename(self.uploaded_file.name)

    def filename(self):
     return os.path.basename(self.uploaded_file.name)

我想做这样的事情

        sr_files=File.objects.filter(filename__contains=keyword)

但我不能使用带有 filename() 自定义函数的过滤器 请帮忙

这是我的模板代码

    % if sr_files %
    <ul>
    % for rf in sr_files %
        <li><a href="/documents/rf.uploaded_file"> rf.filename </a></li>
    % endfor %
    </ul>
    % else %
        <p>No Files Found containing  keyword </p>
    % endif %

【问题讨论】:

【参考方案1】:

返回路径中最后一个/ 之后的部分是os.path.basename 所做的。所以你可以使用regex lookup

import re
File.objects.filter(uploaded_file__regex='[^/]*[^/]*$'.format(re.escape(keyword)))

或者干脆

files = File.objects.filter(uploaded_file__contains=keyword)
# Then discard false matches
files = (f for f in files if keyword in f.filename())

【讨论】:

【参考方案2】:

是的,您不能在过滤器中使用属性和函数的名称

这可以使用列表压缩或生成器表达式,如下所示:

# for single File object 
sr_file = next(
          (f for f in File.objects.filter() if keyword in f.filename()), 
          None)

# for: all File objects contains keywords in their file path: 
sr_files = [f for f in File.objects.filter() if keyword in f.filename()]

【讨论】:

是的,它给了我所需的输出,但我希望 sr_files 成为文件类型对象的集合,以便我可以通过在文件类型对象中提供带有 id 的适当链接来打开文件这是我的模板代码 第二个列表压缩表达式中的@wrufesh sr_files 确实是文件类型对象的集合。您可以在其上迭代模板代码。 @wrufesh 欢迎您 :),顺便说一句,如果您在模板代码中的 rf.filename 中出现错误,请使其属性阅读此 Q & As

以上是关于django QuerySet 过滤器()的主要内容,如果未能解决你的问题,请参考以下文章

django QuerySet 过滤器()

在django中动态添加参数到queryset过滤器调用[重复]

Django Queryset 过滤器检查相关对象是不是存在

Django查询集QuerySet及两大特性

django queryset过滤外键

Django QuerySet 过滤器 + order_by + 限制