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
--
noris network AG - Deutschherrnstraße 15-19 - D-90429 Nürnberg -
Tel +49-911-9352-0 - Fax +49-911-9352-100
http://www.noris.de - The IT-Outsourcing Company
Vorstand: Ingo Kraupa (Vorsitzender), Joachim Astel, Hansjochen Klenk -
Vorsitzender des Aufsichtsrats: Stefan Schnabel - AG Nürnberg HRB 17689
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---
>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
--
1.4.4.2