Opened 5 years ago
Last modified 5 years ago
#32524 closed Bug
unexpected behavior when using gettattr for related object — at Initial Version
| Reported by: | elonzh | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 3.1 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | yes |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Assuming we have a model like that:
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
...
An user may not have an UserProfile instance so we will use such logic:
profile = getattr(request.user, "profile", UserProfile(user=request.user))
But django will always return the default value no matter request.user.profile exists or not.
Here is the poc:
In [1]: u = User.objects.get(username='s') In [2]: u.profile Out[2]: <UserProfile: UserProfile object (5)> In [3]: getattr(u, 'profile', UserProfile()) Out[3]: <UserProfile: UserProfile object (5)> In [4]: getattr(u, 'profile', UserProfile(user=u)) Out[4]: <UserProfile: UserProfile object (None)>
the problem is UserProfile(user=u) will update the User.profile when we init UserProfile.
Note:
See TracTickets
for help on using tickets.