Login

Binding pre-existing tables with dynamically created class models

Author:
rodsenra
Posted:
July 13, 2007
Language:
Python
Version:
.96
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. Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
  5. Help text hyperlinks by sa2812 1 year, 6 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.