Adrian Holovaty wrote: > On 9/18/05, Eric Walstad <[EMAIL PROTECTED]> wrote: [...] > > Is it possible to do what I want, move common fields to a super class, > > without generating a table for that super class? > > It's not currently possible, but that exact functionality is on the > to-do list: http://code.djangoproject.com/ticket/419 . > > Adrian
Hi Adrian, I'm short on time, but I think I may have hacked up something that works (for me) and passes the unit tests. Eric. [EMAIL PROTECTED] django_src]$ diff -u django/core/meta/__init__.py.orig django/core/meta/__init__.py --- django/core/meta/__init__.py.orig 2005-09-18 14:51:18.000000000 -0700 +++ django/core/meta/__init__.py 2005-09-18 15:59:20.000000000 -0700 @@ -412,6 +412,11 @@ # attribute order. fields.sort(lambda x, y: x.creation_counter - y.creation_counter) + # Should this class generate database tables (Default is Yes)? + # This has the ultimate effect of keeping this class out of the _MODELS + # list. + create_table = not (meta_attrs.pop('no_table', False)) + # If this model is a subclass of another model, create an Options # object by first copying the base class's _meta and then updating it # with the overrides from this class. @@ -673,7 +678,9 @@ # contain this list: # [<class 'django.models.polls.Poll'>, <class 'django.models.polls.Choice'>] # Don't do this if replaces_module is set. - app_package.__dict__.setdefault('_MODELS', []).append(new_class) + # Exclude models where the user has set 'no_table = True' + if create_table: + app_package.__dict__.setdefault('_MODELS', []).append(new_class) # Cache the app label. opts.app_label = app_label @@ -725,6 +732,7 @@ def __repr__(self): return '<%s object>' % self.__class__.__name__ + ############################################ # HELPER FUNCTIONS (CURRIED MODEL METHODS) # ############################################ [EMAIL PROTECTED] django_src]$ python tests/runtests.py Running tests with database 'postgresql' All tests passed. experiment.py file: from django.core import meta class MyBaseClass(meta.Model): """This class will not result in any tables being generated by django""" created_on = meta.DateTimeField(auto_now_add=True) modified_on = meta.DateTimeField(auto_now=True) class META: no_table = True class MyDerived(MyBaseClass): """This class will have tables generated and will include the: - created_on and - modified_on fields which are inherited from the 'MyBaseClass' class. """ name = meta.CharField(maxlength=25) class META: module_name = 'my_derived_class' class MyOtherDerived(MyDerived): """This class will not result in any tables being generated by django and it will include all the fields inherited from both 'MyBaseClass' and 'MyDerived' as well as those fields defined here. """ color = meta.CharField(maxlength=25) class META: module_name = 'my_other_derived' # Explicitly set the no_table flag so that this class doesn't result in # a table being created. no_table = True class MyLastDerived(MyOtherDerived): """This class will have tables generated and will include the: - created_on and - modified_on fields which are inherited from the 'MyBaseClass' class, - name which is inherited from the 'MyDerived' class and - color which is inherited from the 'MyOtherDerived' class as well as those fields defined here. """ size = meta.IntegerField(choices=((0, 'small'), (1, 'medium'), (2, 'large'), )) class META: module_name = 'my_last_derived' [EMAIL PROTECTED] django_src]$ django-admin.py sql experiment BEGIN; CREATE TABLE experiment_my_derived_class ( id serial NOT NULL PRIMARY KEY, modified_on timestamp with time zone NOT NULL, created_on timestamp with time zone NOT NULL, name varchar(25) NOT NULL ); CREATE TABLE experiment_my_last_derived ( id serial NOT NULL PRIMARY KEY, color varchar(25) NOT NULL, modified_on timestamp with time zone NOT NULL, created_on timestamp with time zone NOT NULL, name varchar(25) NOT NULL, size integer NOT NULL );