On Thu, Nov 26, 2009 at 9:56 AM, Kevin Renskers <i...@bolhoed.net> wrote:
> Just a small update: the DynamicModels way as described on the wiki
> doesn't work (it also says that it only works in Django 0.96, so
> yeah..).
>
> If anyone has any idea how to do this, I would be very thankful!
>
>
> On Nov 24, 2:35 pm, Kevin Renskers <i...@bolhoed.net> wrote:
>> Hi all,
>>
>> In my Django project I want to have a model that is dynamically
>> created. I tried using the __init__ function for this,  something like
>> so:
>>
>> fields = ['field_a', 'field_b', 'field_c']
>>
>> class MyModel(models.Model):
>>     def __init__(self, *args, **kwargs):
>>         for field in fields:
>>             setattr(self, field, models.DecimalField(decimal_places=4,
>> max_digits=10))
>>
>> Sadly, this doesn't work. The columns don't get created when you run
>> the syncdb command, and even something like
>> MyModel._meta.get_all_field_names() doesn't return the dynamic fields.
>>
>> So, is there a way I can create a "dynamic" model? I did come 
>> acrosshttp://code.djangoproject.com/wiki/DynamicModelsbut I don't really
>> get that. It looks so much different then normal models, it seems like
>> I would loose a lot of functionality or would have to change a lot of
>> code somewhere else in my application?
>>
>> Hopefully there is an easy way to do this :)
>>

I can see two ways to achieve what you seem to want:

1. Add fields after the model has been created

This method uses an only unofficially documented feature[1] of
Django's model field classes.

class MyModel(models.Model):
    # a few fields

for field in fields:
    MyModel.add_to_class(field, models.DecimalField(decimal_places=4,
max_digits=10))



2. Construct a new type dynamically

class Meta:
    verbose_name = _('my model')

attrs = {
    '__module__': 'mymodule',
    'Meta': Meta,
    'method1': method1,
    # ... more fields and methods
}

for field in fields:
    attrs[field] = models.DecimalField(...)

MyModel = type('MyModel', (models.Model,), attrs)




Of course, the usual caveats apply. It might make your code harder to
read and understand, and harder to debug too, because it is not clear
what model fields exist by simply looking at the model code (that
applies especially to method 1)


Matthias

[1]: It's documented in Marty Alchin's excellent Pro Django book. I
think we can assume that this method won't go away without very good
reasons(tm).

--

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


Reply via email to