Django

Code

Changeset 3134

Show
Ignore:
Timestamp:
06/16/06 14:18:30 (2 years ago)
Author:
jacob
Message:

Added generic foreign key support to Django. Much thanks to Ian Holsman and
Luke Plant -- most of this code is theirs. Documentation is to follow; for now
see the example/unit test. Fixes #529.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/core/management.py

    r3100 r3134  
    212212def _get_many_to_many_sql_for_model(klass): 
    213213    from django.db import backend, get_creation_module 
     214    from django.db.models import GenericRel 
     215     
    214216    data_types = get_creation_module().DATA_TYPES 
    215217 
     
    217219    final_output = [] 
    218220    for f in opts.many_to_many: 
    219         table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \ 
    220             style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' ('] 
    221         table_output.append('    %s %s %s,' % \ 
    222             (style.SQL_FIELD(backend.quote_name('id')), 
    223             style.SQL_COLTYPE(data_types['AutoField']), 
    224             style.SQL_KEYWORD('NOT NULL PRIMARY KEY'))) 
    225         table_output.append('    %s %s %s %s (%s),' % \ 
    226             (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), 
    227             style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__), 
    228             style.SQL_KEYWORD('NOT NULL REFERENCES'), 
    229             style.SQL_TABLE(backend.quote_name(opts.db_table)), 
    230             style.SQL_FIELD(backend.quote_name(opts.pk.column)))) 
    231         table_output.append('    %s %s %s %s (%s),' % \ 
    232             (style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())), 
    233             style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__), 
    234             style.SQL_KEYWORD('NOT NULL REFERENCES'), 
    235             style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)), 
    236             style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)))) 
    237         table_output.append('    %s (%s, %s)' % \ 
    238             (style.SQL_KEYWORD('UNIQUE'), 
    239             style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), 
    240             style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())))) 
    241         table_output.append(');') 
    242         final_output.append('\n'.join(table_output)) 
     221        if not isinstance(f.rel, GenericRel): 
     222            table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \ 
     223                style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' ('] 
     224            table_output.append('    %s %s %s,' % \ 
     225                (style.SQL_FIELD(backend.quote_name('id')), 
     226                style.SQL_COLTYPE(data_types['AutoField']), 
     227                style.SQL_KEYWORD('NOT NULL PRIMARY KEY'))) 
     228            table_output.append('    %s %s %s %s (%s),' % \ 
     229                (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), 
     230                style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__), 
     231                style.SQL_KEYWORD('NOT NULL REFERENCES'), 
     232                style.SQL_TABLE(backend.quote_name(opts.db_table)), 
     233                style.SQL_FIELD(backend.quote_name(opts.pk.column)))) 
     234            table_output.append('    %s %s %s %s (%s),' % \ 
     235                (style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())), 
     236                style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__), 
     237                style.SQL_KEYWORD('NOT NULL REFERENCES'), 
     238                style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)), 
     239                style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)))) 
     240            table_output.append('    %s (%s, %s)' % \ 
     241                (style.SQL_KEYWORD('UNIQUE'), 
     242                style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), 
     243                style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())))) 
     244            table_output.append(');') 
     245            final_output.append('\n'.join(table_output)) 
    243246    return final_output 
    244247 
  • django/trunk/django/db/models/__init__.py

    r3113 r3134  
    99from django.db.models.fields import * 
    1010from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED 
     11from django.db.models.fields.generic import GenericRelation, GenericRel, GenericForeignKey 
    1112from django.db.models import signals 
    1213from django.utils.functional import curry