How can I make default value for a field to be taken from existing objects of a model?
I tried these and it didn't worked:
1)
class ModelA(models.Model):
fieldA = models.CharField(default=self.get_previous())
def get_previous(self):
return ModelA.objects.all()[0].fieldA
NameError: name 'self' is not defined
2)
class ModelA(models.Model):
fieldA = models.CharField(default=ModelA.get_previous())
@staticmethod
def get_previous():
return ModelA.objects.all()[0].fieldA
NameError: name 'ModelA' is not defined
3)
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous())
def get_previous():
return ModelA.objects.all()[0].fieldA
NameError: global name 'get_previous' is not defined
4)
def get_previous():
return ModelA.objects.all()[0].fieldA
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous())
NameError: global name 'ModelA' is not defined
I it's clear why 3) and 4) won't work. I can imagine why 1) won't work - looks like class' properies can't refer to instance's (i.e. self). I can imagine why 2) won't work - apparently there's no reference to ModelA until interpreter will go trough whole class.
So how should I approach this?
If you want to just output default value, override
__getattr__()
method like this:Saving default value from object will be little difficultier. First solution that comes in my mind, override
save()
method (i believe there is simpler solution)Option 1: Use model forms. These are forms based on models, that you can easily populate their values with values from a specific instance. This option is good if you want the default value as something to be shown to the user in forms, obviously.
Option 2: Override the model's save method, and code the check there - if fieldA is None, then put some value in it. This option is better if you want the default value to work at the data layer, and not only as form default values (ie, also for instances you create in other ways).
In your examples, you need to remove the call operator
()
.Currently the statement is executed immediately at the first read-parsing cycle. By specifying the symbol name instead, the Django class receives a function pointer which it will execute when it actually needs the default value.
The example becomes:
If you're going to do this for a lot of fields, consider overridding the
save
function, so you only have to fetch the previous object from the database just once.