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