Commit f9c8eeb3 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

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
parent dfd7a6c7
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -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,
+25 −0
Original line number Diff line number Diff line
@@ -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()
[<DerivedM: PK = 44, base_name = b1, derived_name = d1>]

# 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"

"""}