#31104: OneToOneField strange behavior when saving reference
-------------------------------------+-------------------------------------
Reporter: enricodvn | Owner: nobody
Type: Bug | Status: new
Component: Database | Version: 2.1
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
I have a model:
{{{
class LinePassenger(models.Model):
user = models.ForeignKey(User, related_name='lines',
on_delete=models.CASCADE)
line = models.ForeignKey(Line, related_name='passengers',
on_delete=models.CASCADE)
home = models.OneToOneField(StopPoint, related_name='passenger_home',
on_delete=models.SET_NULL, null=True)
work = models.OneToOneField(StopPoint, related_name='passenger_work',
on_delete=models.SET_NULL, null=True)
other fields...
}}}
The class has two methods, among others:
{{{
def replace(self, line, point_payload):
new_passenger = LinePassenger(user=self.user, line=line)
new_passenger.home = StopPoint(
address=self.home.address,
coords=self.work.coords
)
new_passenger.work = StopPoint(
address=self.work.address,
coords=self.work.coords
)
#this method already saves the stop points
new_passenger.update_points_times(point_payload)
new_passenger.save()
self.save()
return new_passenger
}}}
and:
{{{
def update_points_times(self, payload):
self.home.pickup_time = payload['pickup_time']
self.work.dropoff_time = payload['dropoff_time']
if 'return_route' in payload:
self.home.dropoff_time =
payload['return_route']['dropoff_time']
self.work.pickup_time = payload['return_route']['pickup_time']
self.home.save()
self.work.save()
}}}
Now, when I call the first one (replace), it doen't record the OneToOne
relation on the LinePassenger model.
I have fixed it with something rather strange:
{{{
def replace(self, line, point_payload):
new_passenger = LinePassenger(user=self.user, line=line)
new_passenger.home = StopPoint(
address=self.home.address,
coords=self.work.coords
)
new_passenger.work = StopPoint(
address=self.work.address,
coords=self.work.coords
)
#this method already saves the stop points
new_passenger.update_points_times(point_payload)
#don't ask, this seems to be a bug of django's OneToOneField
new_passenger.home = new_passenger.home
new_passenger.work = new_passenger.work
new_passenger.save()
self.save()
return new_passenger
}}}
How does this even worked?
{{{
new_passenger.home = new_passenger.home
new_passenger.work = new_passenger.work
}}}
Seems to be related with [https://stackoverflow.com/questions/21675461
/django-onetoonefield-not-saving-instance]
Sorry if this is not a bug.
--
Ticket URL: <https://code.djangoproject.com/ticket/31104>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/052.3195bad776f6c9e0296efb019812a3eb%40djangoproject.com.