On Saturday, 12 November 2011 23:04:44 UTC, Emil Sandin wrote: > > Hi, I am running a Django app on appengine, but I am constantly > hitting the roof with read operations. > I have not found an easy way to find what's causing this, so I am > trying to find it out myself. > To me, it seems that even if I use all().filter(..) or get(), the > database is queried for all instances. > > I wrote a custom manager like this: > > class LoggingManager(models.Manager): > def get_query_set(self): > query_set = super(SignalsManager, self).get_query_set() > logging.debug("Got the following queryset from the backend:") > logging.debug(query_set) > if query_set.count(): > key = "num_of_reads_for_" + str(type(query_set[0])) > num_of_calls_so_far = memcache.get(key) or 0 > num_of_calls_so_far += query_set.count() > memcache.delete(key) > memcache.add(key, num_of_calls_so_far ) > logging.debug("++++++++++++++++++++++++++++++++++") > logging.debug("total number of reads for " + key) > logging.debug(num_of_calls_so_far) > logging.debug("----------------------------------") > return query_set > > I then created a class: > > class Foo(models.Model): > bar = models.CharField(max_length=10) > objects = LoggingManager() > > When I tried this in the shell I got: > > >>> Foo(bar="Hi").save() > >>> Foo(bar="there").save() > >>> Foo.objects.get(bar="Hi") > DEBUG:root:Got the following queryset from the backend: > DEBUG:root:[<Foo: Foo object>, <Foo: Foo object>] > DEBUG:root:++++++++++++++++++++++++++++++++++ > DEBUG:root:total number of reads for num_of_reads_for_<class > 'models.Foo'> > DEBUG:root:2 > DEBUG:root:---------------------------------- > <Foo: Foo object> > >>> Foo.objects.all().filter(bar="Hi") > DEBUG:root:Got the following queryset from the backend: > DEBUG:root:[<Foo: Foo object>, <Foo: Foo object>] > DEBUG:root:++++++++++++++++++++++++++++++++++ > DEBUG:root:total number of reads for num_of_reads_for_<class > 'models.Foo'> > DEBUG:root:4 > DEBUG:root:---------------------------------- > [<Foo: Foo object>] > >>> Foo.objects.all().filter(bar="NotExisting") > DEBUG:root:Got the following queryset from the backend: > DEBUG:root:[<Foo: Foo object>, <Foo: Foo object>] > DEBUG:root:++++++++++++++++++++++++++++++++++ > DEBUG:root:total number of reads for num_of_reads_for_<class > 'models.Foo'> > DEBUG:root:6 > DEBUG:root:---------------------------------- > [] > > According to the Django documentation, 'the act of creating a QuerySet > doesn't involve any database activity'. > But since the queryset contains two instances of Foo object when I use > the get() method or all().filter(), isn't the database queried for all > Foo instances? And then the queryset is filtered? > Am I doing something wrong here? Is there a better way to do this? > And does anybody know how this would affect App Engines Quote Details, > since they have a limit of number of operations? > > I am using: > Python 2.5.1, > Django (1, 3, 0, 'alpha', 1)
This message is probably off-topic for this list, as Django running on AppEngine is not really the same as Django standalone - it depends on django-nonrel to talk to the nonrelational datastore, so database behaviour is very different. You would probably be better off asking on a specific django-nonrel mailing list. In ordinary Django, each call to LoggingManager would result in a single database hit, which would be executed when it reaches the first logging call, since in order to output the string representation of the QuerySet Django would need to actually evaluate it. The call to type(query_set[0]) would not cause another hit, because Django has already stored the values inside the QuerySet's internal cache. Clearly django-nonrel is doing something different here, but I don't have enough experience with it to tell you what. I can say that in plain AppEngine, without Django, you can call `queryset.kind()` to get the queryset's model without any database access, but I don't know if that will work with django-nonrel. -- DR. -- You received this message because you are subscribed to the Google Groups "Django users" group. To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/ybXDsP_RP1EJ. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.