Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Models: Override a field return value

I'm wondering if it is possible to override the default value of a field when it is returned. Say I had a model:

class ModelA(models.Model)
    name = models.CharField(max_length=30)

Is there any way that calling

modela_instance.name 

can return a modified value, for example name + " foo", but have the code that appends foo run by default within the model itself, so all I would need to do is call name to get the appended value?

I should elaborate and say that what I'm actually hoping to do is have a method within the model:

def get_name(self):
     return self.name + " foo"

or similar, and just want that get_name method to override the call to the field "name".

like image 704
PT114 Avatar asked Apr 30 '12 11:04

PT114


2 Answers

Yes, you can use properties to do this

class ModelA(models.Model)
    _name = models.CharField(...)

    def set_name(self, val):
        self._name = "%s - foo" % val

    def get_name(self):
        return self._name

    name = property(get_name, set_name)
like image 63
Timmy O'Mahony Avatar answered Sep 23 '22 06:09

Timmy O'Mahony


Why would you want to do this? Not sure, but I don't think this is a good idea.. However, you can use for example the unicode method:

class ModelA(models.Model)
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return "%s : foo" % self.name

and when calling just use:

modela_instance

or when foo has to be dynamic:

class ModelA(models.Model)
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return "%s : %s" % (self.name, self.make_foo())

    def make_foo(self):
        return "foo"

or define your own method:

class ModelA(models.Model)
    name = models.CharField(max_length=30)

    def alt_name(self):
        return "%s : foo" % self.name  
like image 41
ohrstrom Avatar answered Sep 21 '22 06:09

ohrstrom