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
This commit is contained in:
parent
dfd7a6c781
commit
f9c8eeb311
|
@ -98,8 +98,6 @@ class ModelBase(type):
|
||||||
# Concrete classes...
|
# Concrete classes...
|
||||||
if base in o2o_map:
|
if base in o2o_map:
|
||||||
field = o2o_map[base]
|
field = o2o_map[base]
|
||||||
field.primary_key = True
|
|
||||||
new_class._meta.setup_pk(field)
|
|
||||||
else:
|
else:
|
||||||
attr_name = '%s_ptr' % base._meta.module_name
|
attr_name = '%s_ptr' % base._meta.module_name
|
||||||
field = OneToOneField(base, name=attr_name,
|
field = OneToOneField(base, name=attr_name,
|
||||||
|
|
|
@ -43,6 +43,16 @@ class ParkingLot(Place):
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u"%s the parking lot" % self.name
|
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):
|
class Supplier(models.Model):
|
||||||
restaurant = models.ForeignKey(Restaurant)
|
restaurant = models.ForeignKey(Restaurant)
|
||||||
|
|
||||||
|
@ -293,5 +303,20 @@ True
|
||||||
>>> DerivedM.objects.all()
|
>>> DerivedM.objects.all()
|
||||||
[<DerivedM: PK = 44, base_name = b1, derived_name = d1>]
|
[<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"
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue