16๐
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:
def get_previous():
return ModelA.objects.all()[0].fieldA
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous)
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.
3๐
If you want to just output default value, override __getattr__()
method like this:
class ModelA(models.Model):
# your fields
def __getattr__(self, name):
if(name == 'fieldA' and !self.fieldA):
return self.get_previous()
else:
return super(ModelA, self).__getattr__(name)
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)
- [Django]-How to get key value in django template?
- [Django]-Django Rest Framework update field
- [Django]-Updated at field in django model
3๐
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).
- [Django]-How should I use DurationField in my model?
- [Django]-Django Imagefield not working properly via ModelForm
- [Django]-PyCharm hangs on 'scanning files to index' background task
0๐
"get_previous" works:
# Here
fieldA = models.CharField(default=get_previous)
But "get_previous()" doesnโt work:
# Here
fieldA = models.CharField(default=get_previous())
In addition, your code is lacking Exception Handling so I added it to your code as shown below:
def get_previous():
try:
return ModelA.objects.all()[0].fieldA
except IndexError:
return None
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous)
You can also use this code below. first() returns the first object, or None if there are no objects:
def get_previous():
try: # Here
return ModelA.objects.all().first().fieldA
except AttributeError:
return None
class ModelA(models.Model):
fieldA = models.CharField(default=get_previous)
- [Django]-Pip install PIL fails
- [Django]-Django model naming convention
- [Django]-The way to use background-image in css files with Django