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 的适当链接来打开文件这是我的模板代码 第二个列表压缩表达式中的@wrufeshsr_files
确实是文件类型对象的集合。您可以在其上迭代模板代码。
@wrufesh 欢迎您 :),顺便说一句,如果您在模板代码中的 rf.filename
中出现错误,请使其属性阅读此 Q & As以上是关于django QuerySet 过滤器()的主要内容,如果未能解决你的问题,请参考以下文章
在django中动态添加参数到queryset过滤器调用[重复]