#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.

Reply via email to