Do properties work on Django model fields?

django, model, properties, python

Solution

A model field is already property, so I would say you have to do it the second way to avoid a name clash.

When you define `foo = property(..)` it actually overrides the `foo = models..` line, so that field will no longer be accessible.

You will need to use a different name for the property and the field. In fact, if you do it the way you have it in example #1 you will get an infinite loop when you try and access the property as it now tries to return itself.

EDIT: Perhaps you should also consider not using `_foo` as a field name, but rather `foo`, and then define another name for your property because properties cannot be used in `QuerySet`, so you'll need to use the actual field names when you do a filter for example.

Problem

I think the best way to ask this question is with some code... can I do this: ``` class MyModel(models.Model): foo = models.CharField(max_length = 20) bar = models.CharField(max_length = 20) def get_foo(self): if self.bar: return self.bar else: return self.foo def set_foo(self, input): self.foo = input foo = property(get_foo, set_foo) ``` or do I have to do it like this: ``` class MyModel(models.Model): _foo = models.CharField(max_length = 20, db_column='foo') bar = models.CharField(max_length = 20) def get_foo(self): if self.bar: return self.bar else: return self._foo def set_foo(self, input): self._foo = input foo = property(get_foo, set_foo) ``` note: you can keep the column name as 'foo' in the database by passing a db_column to the model field. This is very helpful when you are working on an existing system and you don't want to have to do db migrations for no reason

Original source

Related problems