wrufesh
wrufesh

Reputation: 1406

django QuerySet filter()

I have a model like this

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)

i want to do somethig like this

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

but i cannot use filter with filename() self defined function Plz help

Here is my template code

    {% 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 %}

Upvotes: 1

Views: 711

Answers (2)

okm
okm

Reputation: 23871

Return the part after the last / in a path is what os.path.basename does. So you could use regex lookup

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

Or simply

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

Upvotes: 1

Grijesh Chauhan
Grijesh Chauhan

Reputation: 58291

Yes, you can't use properties and function's name in filter

This can do either using list compression or generator expression as follows:

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

or

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

Upvotes: 1

Related Questions