Opened 5 years ago
Last modified 4 years ago
#31891 new Bug
Inconsistent related field cache invalidation — at Version 2
| 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 which does the cache invalidation as expected. Or using b.refresh_from_db(). 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 (2)
comment:1 by , 5 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 5 years ago
| Description: | modified (diff) |
|---|
Note:
See TracTickets
for help on using tickets.