Thanks, Michael, I'll give it a try.
/Lars
Michael Radziej wrote:
> Hi Lars,
>
> I found myself in a similar position, and I'm also coming from the database
> side ... funny ;-)
>
> I have attached a small patch that solved the problem for me and might be a
> start for you, but be aware, it's more a crutch than a solution.
>
> - this patch won't make it into the project, so you have to maintain it on
> your own
>
> - it doesn't try to work for the admin or for newforms (but made be working
> for it), so I didn't have to deal with the admin URLs at all.
>
> - it does not deal with creating databases or database introspection.
>
> For a model with multiple primary keys, add an Meta class attribute
> `has_composite_primary_key_key=True`. Here's an example model with
> multiple primary keys:
>
> class Kundemail(UpdatelogMixin, models.Model):
> kunde = models.ForeignKey(Kunde, db_column='kunde', primary_key = True)
> dienst = DescriptorField(Descr, "dienst", db_column="dienst", primary_key
> = True)
> person = models.ForeignKey(Person, db_column='person', primary_key = True)
>
> class Meta:
> db_table = 'kundemail'
> has_composite_primary_key = True
>
> So long,
>
> Michael
>
>
>
> ------------------------------------------------------------------------
>
> From nobody Mon Sep 17 00:00:00 2001
> From: Michael Radziej <[EMAIL PROTECTED]>
> Date: Mon Aug 13 16:03:06 2007 +0200
> Subject: [PATCH] composite pkey
>
> Refreshed patch composite-pkey.
> (Base: da455ae19930af1b4513b37de8bd8e9f68ec6c3d)
> (Last: 22c5ecf0407989824916f6b1676a4632c336a9d1)
>
> ---
>
> django/core/management.py | 9 ++++++++-
> django/db/models/options.py | 4 +++-
> 2 files changed, 11 insertions(+), 2 deletions(-)
>
> base 0f7580c29c7e992e9a071d3df62260e0609c2c68
> last f7b6a55742bbf1ff867d841cdc17942fff357470
> diff --git a/django/core/management.py b/django/core/management.py
> index
> 882ff6de323a45a718c4d84b592da8a1ecc7357e..7f11101e69490faca4dcaac1b6acd29454a6ab0b
> 100644
> --- a/django/core/management.py
> +++ b/django/core/management.py
> @@ -157,6 +157,7 @@ def _get_sql_model_create(model, known_models=set()):
> opts = model._meta
> final_output = []
> table_output = []
> + composite_pkeys = []
> pending_references = {}
> for f in opts.fields:
> col_type = f.db_type()
> @@ -172,7 +173,10 @@ def _get_sql_model_create(model, known_models=set()):
> if f.unique and (not f.primary_key or backend.allows_unique_and_pk):
> field_output.append(style.SQL_KEYWORD('UNIQUE'))
> if f.primary_key:
> - field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
> + if opts.has_composite_primary_key:
> + composite_pkeys.append(f)
> + else:
> + field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
> if tablespace and backend.supports_tablespaces and (f.unique or
> f.primary_key) and backend.autoindexes_primary_keys:
> # We must specify the index tablespace inline, because we
> # won't be generating a CREATE INDEX statement for this field.
> @@ -196,6 +200,9 @@ def _get_sql_model_create(model, known_models=set()):
> for field_constraints in opts.unique_together:
> table_output.append(style.SQL_KEYWORD('UNIQUE') + ' (%s)' % \
> ",
> ".join([backend.quote_name(style.SQL_FIELD(opts.get_field(f).column)) for f
> in field_constraints]))
> + if opts.has_composite_primary_key:
> + table_output.append(style.SQL_KEYWORD('PRIMARY KEY')+ ' (%s)' % \
> + ", ".join([backend.quote_name(style.SQL_FIELD(f.column)) for f
> in composite_pkeys]))
>
> full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' +
> style.SQL_TABLE(backend.quote_name(opts.db_table)) + ' (']
> for i, line in enumerate(table_output): # Combine and add commas.
> diff --git a/django/db/models/options.py b/django/db/models/options.py
> index
> 7cccb611cf354d5e9d5288a05f7c788ee6a4fa52..60e050b2ddd3a26a4941ba5fb1706338699137a7
> 100644
> --- a/django/db/models/options.py
> +++ b/django/db/models/options.py
> @@ -15,7 +15,8 @@ get_verbose_name = lambda class_name:
> re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|
>
> DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
> 'unique_together', 'permissions', 'get_latest_by',
> - 'order_with_respect_to', 'app_label', 'db_tablespace')
> + 'order_with_respect_to', 'app_label', 'db_tablespace',
> + 'has_composite_primary_key')
>
> class Options(object):
> def __init__(self, meta):
> @@ -36,6 +37,7 @@ class Options(object):
> self.has_auto_field = False
> self.one_to_one_field = None
> self.parents = []
> + self.has_composite_primary_key = False
>
> def contribute_to_class(self, cls, name):
> cls._meta = self
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---