【问题标题】:django QuerySet filter()django QuerySet 过滤器()
【发布时间】: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 %}

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案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
      猜你喜欢
      • 2013-09-08
      • 2018-10-09
      • 2011-03-04
      • 2021-06-16
      • 2016-07-21
      • 2021-05-13
      • 2020-12-24
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多