django QuerySet过滤器()
我有一个这样的模型django QuerySet过滤器(),django,django-models,django-queryset,Django,Django Models,Django Queryset,我有一个这样的模型 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
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)
我想做这样的事
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)
但是我不能将filter与filename()自定义函数一起使用
Plz帮助
这是我的模板代码
{% 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 %}
{%if sr_文件%}
{sr_文件中rf的%s%}
{%endfor%}
{%else%}
未找到包含{{keyword}}的文件
{%endif%}
是的,您不能在筛选器中使用属性和函数名
这可以使用列表压缩或生成器表达式执行,如下所示:
# for single File object
sr_file = next(
(f for f in File.objects.filter() if keyword in f.filename()),
None)
或
返回路径中最后一个
/
后面的部分是os.path.basename
所做的。所以你可以用
或者干脆
files = File.objects.filter(uploaded_file__contains=keyword)
# Then discard false matches
files = (f for f in files if keyword in f.filename())
是的,它为我提供了所需的输出,但我希望sr_文件是文件类型对象的集合,这样我就可以通过在文件类型对象中提供id的适当链接来打开文件。这是我的模板code@wrufesh在第二个列表中,压缩表达式
sr_文件
确实是文件类型对象的集合。您可以在模板代码中进行迭代。@wrufesh Your welcome:),顺便说一句,如果您在模板代码中的rf.filename
中出现错误,请使其属性读取此