Django Models: Override a field return value

2019-04-08 19:24发布

问题:

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".

回答1:

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)


回答2:

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