Opened 4 years ago
Last modified 3 years ago
#31891 new Bug
Inconsistent related field cache invalidation — at Version 3
Reported by: | Josh | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 3.1 |
Severity: | Normal | Keywords: | orm, related, onetoone |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Repro:
from django.db import models class AppUser(models.Model): pass class Profile(models.Model): user = models.OneToOneField( to=AppUser, on_delete=models.PROTECT, ) a = AppUser.objects.create() b = AppUser.objects.create() Profile.objects.create(user=a) b.profile # Errors, since it has not been created yet a.profile.user_id = b.id a.profile.save() # Works! Profile.objects.get(user=b) # <Profile: Profile object (1)> b.profile # Errors, since it uses the cached value
I can fix it by using a.profile.user = b
instead of a.profile.user_id = b.id
which does the cache invalidation as expected. Or using b.refresh_from_db()
after the save()
call. However I think it makes sense to fix this within the ORM because it's a subtle bug that can cause issues.
This is a contrived example but the real use-case was cloning a model instance. And instead of erroring it just kept returning the cached value
Change History (3)
comment:1 by , 4 years ago
Description: | modified (diff) |
---|
comment:2 by , 4 years ago
Description: | modified (diff) |
---|
comment:3 by , 4 years ago
Description: | modified (diff) |
---|
Note:
See TracTickets
for help on using tickets.