1👍
After some more digging, I’ve found the place in the code to do this.
The file in question is django/db/models/fields/related.py
You need to insert two lines into this file.
Locate class “SingleRelatedObjectDescriptor”. You need to change the function __get__() as follows:
def __get__(self, instance, instance_type=None):
if instance is None:
return self
try:
return getattr(instance, self.cache_name)
except AttributeError:
raise Exception("Automated Database Fetch on %s.%s" % (instance._meta.object_name, self.related.get_accessor_name()))
# leave the old code here for when you revert!
Similarly, in class “ReverseSingleRelatedObjectDescriptor” further down the code, you again need to change __get__() to:
def __get__(self, instance, instance_type=None):
if instance is None:
return self
cache_name = self.field.get_cache_name()
try:
return getattr(instance, cache_name)
except AttributeError:
raise Exception("Automated Database Fetch on %s.%s" % (instance._meta.object_name, self.field.name))
# BEWARE: % parameters are different to previous class
# leave old code here for when you revert
Once you’ve done this, you’ll find that Django raises an exception every time it performs an automatic database lookup. This is pretty annoying when you first start, but it will help you track down those pesky database lookups. Obviously, when you’ve found them all, it’s probably best to revert the database code back to normal. I would only suggest using this during a debugging/performance investigation phase and not in the live production code!
0👍
So, you’re asking how to stop a method from doing what it’s specifically designed to do? I don’t understand why you would want to do that.
However, one thing to know about select_related is that it doesn’t automatically follow relationships which are defined as null=True
. So if you can set your FKs to that for now, the relationship won’t be followed.