Login

Binding pre-existing tables with dynamically created class models

Author:
rodsenra
Posted:
July 13, 2007
Language:
Python
Version:
.96
Tags:
orm dynamic-model
Score:
3 (after 3 ratings)

This snippet proposes a solution for pre-exisiting database tables that have no counterpart in your django application models.py module.

My use case was a comercial systems where pricing tables were created on-the-fly as a result of a stored procedure's execution inside the database. These pricing tables had no counterpart class model. Therefore, to access these tables from Python code you had to bypass Django's ORM and use plain-old SQL through cursos.execute().

This snippet's strategy is to create a (model) class on the fly and inject that class inside models.py namespace. After that you can use the generated class and Django's ORM machinery to access the tables, as if they were created by syncdb.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def create_tp_model(table_name, table_schema, namespace):
    '''Function that creates a class dynamically and injects it into namespace.
    Usually namespace is an object that corresponds to models.py's in memory object.
    ''' 
    template = '''
class %s(models.Model):
    %s
    class Meta:
        db_table = '%s'
'''
    exec template%(table_name, table_schema, table_name) in namespace       


# sample 
table_name = 'SampleTable'    
table_schema = """
    price = models.DecimalField("Price", max_digits=10, decimal_places=3)
    product = models.ForeignKey('Product')
"""

# Usage
from django.db import connection, get_introspection_module
introspection_module = get_introspection_module()
cursor = connection.cursor()

# Use globals() if this code already runs in models.py
# otherwise import models and use the module instance instead of globals(). 
create_tp_model(table_name, table_schema, globals())

More like this

  1. Table Creation Using ORM Standalone by EliAndrewC 7 years, 5 months ago
  2. Ordered items in the database - alternative by Leonidas 8 years, 2 months ago
  3. Django Using Stored Procedure by iapain 8 years, 4 months ago
  4. FieldAccessForm (per-field user access for forms derived from models) by Killarny 6 years, 9 months ago
  5. Quick and dirty way to make dynamically available all tables of a database as models by henning 8 years, 2 months ago

Comments

rodsenra (on July 13, 2007):

I would like to thank Andrews Medina for the suggestion of posting this snippet here, and thank Rafael Sierra for improving the snippet to make it more general.

#

Please login first before commenting.