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.