Django

Code

Changeset 3197

Show
Ignore:
Timestamp:
06/23/06 03:16:36 (2 years ago)
Author:
russellm
Message:

Fixed #1661 -- Added logic for string-form model references in the 'to' argument of OneToOneFields?. Includes regression test.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/models/fields/related.py

    r3196 r3197  
    516516class OneToOneField(RelatedField, IntegerField): 
    517517    def __init__(self, to, to_field=None, **kwargs): 
     518        try: 
     519            to_name = to._meta.object_name.lower() 
     520        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT 
     521            assert isinstance(to, basestring), "OneToOneField(%r) is invalid. First parameter to OneToOneField must be either a model, a model name, or the string %r" % (to, RECURSIVE_RELATIONSHIP_CONSTANT) 
     522        else: 
     523            to_field = to_field or to._meta.pk.name 
    518524        kwargs['verbose_name'] = kwargs.get('verbose_name', '') 
    519         to_field = to_field or to._meta.pk.name 
    520525 
    521526        if kwargs.has_key('edit_inline_type'): 
  • django/trunk/tests/regressiontests/string_lookup/models.py

    r3195 r3197  
    2222        return "Whiz %s" % self.name 
    2323 
     24class Child(models.Model): 
     25    parent = models.OneToOneField('Base') 
     26    name = models.CharField(maxlength = 50) 
     27 
     28    def __str__(self): 
     29        return "Child %s" % self.name 
     30     
     31class Base(models.Model): 
     32    name = models.CharField(maxlength = 50) 
     33 
     34    def __str__(self): 
     35        return "Base %s" % self.name 
     36 
    2437API_TESTS = """ 
    25 # Regression test for #1662: Check that string form referencing of models works, both as 
    26 # pre and post reference 
     38# Regression test for #1661 and #1662: Check that string form referencing of models works,  
     39# both as pre and post reference, on all RelatedField types. 
    2740 
    2841>>> f1 = Foo(name="Foo1") 
     
    4659<Foo: Foo Foo1> 
    4760 
     61>>> base1 = Base(name="Base1") 
     62>>> base1.save() 
     63 
     64>>> child1 = Child(name="Child1", parent=base1) 
     65>>> child1.save() 
     66 
     67>>> child1.parent 
     68<Base: Base Base1> 
    4869"""