Python Forum

Full Version: magic related field in Django model
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello

I have a Django model class as:

from django.db import models class DeliveryUpdate(models.Model): delivery_id = models.CharField(max_length=32, blank=False, unique=True) field_updates = JSONField() @property def delivery_address(self): return self.delivery_address_ref @delivery_address.setter def delivery_address(self, value): # Line 15 print ("At the setter for delivery_address") #To check if this function is called self.delivery_address_ref = value

The app runs under docker. After data was populated by some csv files, the table deliveryupdate is created with fields delivery_id and field_updates (there is no delivery_address field in this table)

In a utils.py code, I saw there is the codes to return a delivery_address as:

delivery_id = "xzy" delivery_update = DeliveryUpdate.objects.get(delivery_id=delivery_id) delivery_address = delivery_update.delivery_address #line 27 print (str(delivery_address)) # I could see a valid delivery_address here
I do not understand here is how the value for delivery_update.delivery_address is returned (line 27) when the setter function is NOT called (eg: line #15 delivery_address(self, value)). In another word, I could not find the printout string "At the setter for delivery_address".

Look around, I could see a related class as:

class DeliveryAddress(models.Model): ... delivery_update = models.OneToOneField( 'DeliveryUpdate', db_column='delivery_update', to_field='delivery_id', related_name='delivery_address_ref', on_delete=models.CASCADE, max_length=32 ) ... 
I also saw the table deliveryaddress is created.

I am new to Python and Django, could you please explain why delivery_address is returned when setter function is not called. Some magic things happen here ???

Many thanks
I think I found it. DeliveryUpdate object can have a ref of DeliveryAddress
Thanks