views:

299

answers:

4

I think the best way to ask this question is with some code... can I do this? (edit: ANSWER: no)


    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:

Yes, you 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

+1  A: 

http://www.djangoproject.com/documentation/models/properties/

zalew
hehe I actually came here immediately after reading that =D
Jiaaro
+3  A: 

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.

Andre Miller
regarding the edit, that is good advice - I am maintaining an existing system and because the name of the field must be changed (or of the property) we abandoned this approach. The technique might turn out to be useful in the future though :)
Jiaaro
wasn't sure if it would be accessible via closure or something like that - admittedly, I do not know much about closures
Jiaaro
A: 

http://code.djangoproject.com/ticket/3148

A: 

Can you get properties to show up in Admin?

Henri