开发者

Django database caching

开发者 https://www.devze.com 2022-12-25 10:21 出处:网络
The object user has a foreign key relationship to address.Is there a difference between samples 1 and 2?Does sample 1 run the query multiple times?Or is the address obj开发者_运维知识库ect cached?

The object user has a foreign key relationship to address. Is there a difference between samples 1 and 2? Does sample 1 run the query multiple times? Or is the address obj开发者_运维知识库ect cached?

# Sample 1
country = user.address.country
city = user.address.city
state = user.address.state

# Sample 2
address = user.address
country = address.country
city = address.city
state = address.state


The address object is indeed cached. You can see this if you print the contents of user.__dict__ before and after accessing user.address. For example:

>>> user.__dict__
{'date_joined': datetime.datetime(2010, 4, 1, 12, 31, 59),
 'email': u'user@test.com',
 'first_name': u'myfirstname',
 'id': 1L,
 'is_active': 1,
 'is_staff': 1,
 'is_superuser': 1,
 'last_login': datetime.datetime(2010, 4, 1, 12, 31, 59),
 'last_name': u'mylastname',
 'password': u'sha1$...$...',
 'username': u'myusername'}

>>> country = user.address.country
>>> user.__dict__
{'_address': <myapp.models.address object at 0xwherever,
 'email': u'user@test.com',
 ...etc}

So the user object gains a _address object which is used for subsequent lookups on the related object.

You can use select_related() when you first get the user to pre-populate this cache even before accessing address, so you only hit the database once.

0

精彩评论

暂无评论...
验证码 换一张
取 消