app/django/db/backends/postgresql_psycopg2/introspection.py
author Sverre Rabbelier <srabbelier@gmail.com>
Wed, 02 Sep 2009 10:24:10 +0200
changeset 2854 003a84e774e2
parent 323 ff1a9aa48cfd
permissions -rw-r--r--
Add support for prefetching fields This makes it possible to specify the fields that should be prefetched as part of a getForFields query. Doing a prefetch on a ReferenceProperty when it is known that the property will be referenced in (almost all) entities is far more efficient than doing the invididual fetches sequentially.

from django.db.backends.postgresql.introspection import DatabaseIntrospection as PostgresDatabaseIntrospection

class DatabaseIntrospection(PostgresDatabaseIntrospection):

    def get_relations(self, cursor, table_name):
        """
        Returns a dictionary of {field_index: (field_index_other_table, other_table)}
        representing all relationships to the given table. Indexes are 0-based.
        """
        cursor.execute("""
            SELECT con.conkey, con.confkey, c2.relname
            FROM pg_constraint con, pg_class c1, pg_class c2
            WHERE c1.oid = con.conrelid
                AND c2.oid = con.confrelid
                AND c1.relname = %s
                AND con.contype = 'f'""", [table_name])
        relations = {}
        for row in cursor.fetchall():
            # row[0] and row[1] are single-item lists, so grab the single item.
            relations[row[0][0] - 1] = (row[1][0] - 1, row[2])
        return relations