﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
31104	OneToOneField strange behavior when saving reference.	Enrico	nobody	"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.
"	Bug	closed	Database layer (models, ORM)	2.1	Normal	duplicate			Unreviewed	0	0	0	0	0	0
