What is the difference between .get() and .fetch(1)

27,435

Solution 1

You're looking at the docs for the wrong get() - you want the get() method on the Query object. In a nutshell, .fetch() always returns a list, while .get() returns the first result, or None if there are no results.

Solution 2

get() requires (I think) that there be exactly one element, and returns it, while fetch() returns a _list_ of the first _n_ elements, where n happens to be 1 in this case.

Share:
27,435
AutomatedTester
Author by

AutomatedTester

Open Source Junkie and community helper! Python hacker, Automation expert, CI/CD believer...

Updated on November 08, 2021

Comments

  • AutomatedTester
    AutomatedTester over 2 years

    I have written an app and part of it is uses a URL parser to get certain data in a ReST type manner. So if you put /foo/bar as the path it will find all the bar items and if you put /foo it will return all items below foo

    So my app has a query like

    data = Paths.all().filter('path =', self.request.path).get()
    

    Which works brilliantly. Now I want to send this to the UI using templates

    {% for datum in data %}

    {{ datum.title }}

    {{ datum.content }}

       </div>
    

    {% endfor %}

    When I do this I get data is not iterable error. So I updated the Django to {% for datum in data.all %} which now appears to pull more data than I was giving it somehow. It shows all data in the datastore which is not ideal. So I removed the .all from the Django and changed the datastore query to

    data = Paths.all().filter('path =', self.request.path).fetch(1)
    

    which now works as I intended. In the documentation it says

    The db.get() function fetches an entity from the datastore for a Key (or list of Keys).

    So my question is why can I iterate over a query when it returns with fetch() but can't with get(). Where has my understanding gone wrong?