Models:
from django.db import models
class Color(models.Model):
name = models.CharField(max_length=10)
class Knight(models.Model):
favorite = models.ForeignKey(Color)
Neither saved or unsaved related objects get cached:
# Unsaved object.
>>> k = Knight(favorite=Color())
>>> hasattr(k, '_favorite_cache')
False
# Saved object.
>>> k = Knight(favorite=Color.objects.create(name='blue'))
>>> hasattr(k, '_favorite_cache')
False
# But assignment with saved or unsaved objects does cache correctly.
>>> k = Knight()
>>> k.favorite = Color()
>>> hasattr(k, '_favorite_cache')
True
>>> k = Knight()
>>> k.favorite = Color.objects.create(name='blue')
>>> hasattr(k, '_favorite_cache')
True
Also, in the saved related object case above, we do an extra query to refetch the object by id.
There's also a problem when trying to access the field when it was passed an unsaved object in the init:
# Unsaved object.
>>> k = Knight(favorite=Color())
>>> k.favorite
Traceback (most recent call last):
...
DoesNotExist
# Saved object.
>>> k = Knight(favorite=Color.objects.create(name='blue'))
>>> k.favorite
<Color: blue>
The attached patch does both:
- Caches saved or unsaved related object passed to the Model init.
- Allows unsaved related objects to be accessed when they were passed to the Model init.