Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django - when is .objects.get() evaluated?

Tags:

python

django

Suppose i have :

class Library(models.Model):
    name = models.CharField(max_length = 100)

class Books(models.Model):
    library = models.ForeignKey(Library)
    book = models.CharField(max_length = 100)

I want to create a new Books, we know we can fill the library on Books with just Library's id, but we can also use instance of Library. My question is, is it better if we just provide the id? If i want to use the instance, then i have to evaluate using .get(), then does it hit the database?

Additional question : From the docs, queryset are lazy, it does not hit the database till evaluated, so when does queryset evaluated?

like image 742
Otskimanot Sqilal Avatar asked Nov 16 '12 23:11

Otskimanot Sqilal


1 Answers

Yes, .get() is immediately evaluated. Using IDs will avoid the database query, certainly.

get isn't lazy since it does not return a QuerySet - it returns a single instance of the model. QuerySets come from stuff like .filter(), so for example Library.objects.filter(id=5) is lazily evaluated while Library.objects.get(id=5) is immediately evaluated.

The actual evaluation of a QuerySet is covered in the docs - basically, any time you actually pull out a value from the QuerySet, it will get evaluated. The complete list is this:

  • Iteration
  • Slicing
  • Pickling
  • repr()
  • len()
  • list()
  • bool()
like image 167
spencer nelson Avatar answered Sep 19 '22 16:09

spencer nelson