Thursday, March 3, 2011

Re: curious about model classes

On 03/03/2011 04:33 PM, bruno desthuilliers wrote:
> It has nothing to do with "looking cool" or anything like that. Using
> models.fields as class attributes in models class statement's body
> allow for the ORM to know what db fields and relations your table has
> - not what instance attributes a model instance will have. Well, not
> directly at least - of course the Model base case makes sure your
> instance will have corresponding instance attributes (for db fields),
> but note that these instance attributes are just plain python
> attributes, NOT the models.fields you defined at the class level.

I have a question about this point.
In one Django application I'm writing, I would like to programatically
add some attributes to a model instance when it's retrieved from the
database.

I thought this would work:

class Foo(models.Model):
bar = models.CharField(max_length=10)
def __init__(self, *args, **kwargs):
super(Foo, self).__init__(self, *args, **kwargs)
self.foobar = do_something(bar)

f = Foo(bar='test')

Until then, it's ok: the model instance 'f' is created and so the
attribute f.foobar; but when I try to save the instance to the db

f.save()

Django fails with an obscure (for me) error:
------------------------------------------------------
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/base.py",
line 458, in save
self.save_base(using=using, force_insert=force_insert,
force_update=force_update)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/base.py",
line 520, in save_base
manager.using(using).filter(pk=pk_val).exists())):
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/query.py",
line 561, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/query.py",
line 579, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/sql/query.py",
line 1170, in add_q
can_reuse=used_aliases, force_having=force_having)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/sql/query.py",
line 1105, in add_filter
connector)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/sql/where.py",
line 67, in add
value = obj.prepare(lookup_type, value)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/sql/where.py",
line 316, in prepare
return self.field.get_prep_lookup(lookup_type, value)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/fields/__init__.py",
line 292, in get_prep_lookup
return self.get_prep_value(value)
File
"/home/lorenzo/.virtualenvs/virgo/lib/python2.6/site-packages/django/db/models/fields/__init__.py",
line 479, in get_prep_value
return int(value)
TypeError: int() argument must be a string or a number, not 'Foo'
-----------------------------------------------

What's wrong with this approach ?

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment