2014-05-24 2 views
1

У меня есть модель, как этотДжанго 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.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) 

я хочу сделать somethig как этот

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

, но я не могу использовать фильтр с именем файла() самостоятельно определенная функция 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 %} 

ответ

1

Да, вы не можете использовать свойство и имя функции в фильтре

Это может сделать либо с помощью сжатия списка или выражение генератора следующим образом:

# 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()] 
+0

да это дает мне желаемый результат, но я хочу sr_files быть коллекция объектов типа файла, так что я могу открыть файл, давая соответствующее ссылка с идентификатором в объекте типа файла. Вот мой код шаблона – wrufesh

+0

@wrufesh во втором выражении для сжатия списка 'sr_files' - это действительно коллекция объектов типа файла. Над которым вы можете перебирать код шаблона. –

+0

да, это делается .. thank u :) – wrufesh

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()) 
Смежные вопросы