Opened 4 years ago
Last modified 4 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.