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 django-users@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to