From f9c8eeb31133d3bf55ae167168fcb2d90ce4d12a Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Wed, 4 Mar 2009 07:21:14 +0000 Subject: [PATCH] Fixed #10406 -- Fixed some problems with model inheritance and pk fields. Manually specifying both a OneToOneField(parent_link=True) and separate a primary key field was causing invalid SQL to be generated. Thanks to Ramiro Morales for some analysis on this one. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9971 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/base.py | 2 -- .../model_inheritance_regress/models.py | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index ad7c97359ef..c7445672ee0 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -98,8 +98,6 @@ class ModelBase(type): # Concrete classes... if base in o2o_map: field = o2o_map[base] - field.primary_key = True - new_class._meta.setup_pk(field) else: attr_name = '%s_ptr' % base._meta.module_name field = OneToOneField(base, name=attr_name, diff --git a/tests/regressiontests/model_inheritance_regress/models.py b/tests/regressiontests/model_inheritance_regress/models.py index d2fa4cbf15d..a1ee6a2d86f 100644 --- a/tests/regressiontests/model_inheritance_regress/models.py +++ b/tests/regressiontests/model_inheritance_regress/models.py @@ -43,6 +43,16 @@ class ParkingLot(Place): def __unicode__(self): return u"%s the parking lot" % self.name +class ParkingLot2(Place): + # In lieu of any other connector, an existing OneToOneField will be + # promoted to the primary key. + parent = models.OneToOneField(Place) + +class ParkingLot3(Place): + # The parent_link connector need not be the pk on the model. + primary_key = models.AutoField(primary_key=True) + parent = models.OneToOneField(Place, parent_link=True) + class Supplier(models.Model): restaurant = models.ForeignKey(Restaurant) @@ -293,5 +303,20 @@ True >>> DerivedM.objects.all() [] +# Regression tests for #10406 + +# If there's a one-to-one link between a child model and the parent and no +# explicit pk declared, we can use the one-to-one link as the pk on the child. +# The ParkingLot2 model shows this behaviour. +>>> ParkingLot2._meta.pk.name +"parent" + +# However, the connector from child to parent need not be the pk on the child +# at all. +>>> ParkingLot3._meta.pk.name +"primary_key" +>>> ParkingLot3._meta.get_ancestor_link(Place).name # the child->parent link +"parent" + """}