Author: russellm
Date: 2009-06-08 00:29:47 -0500 (Mon, 08 Jun 2009)
New Revision: 10953

Added:
   django/branches/releases/1.0.X/tests/modeltests/custom_pk/fields.py
Modified:
   django/branches/releases/1.0.X/
   django/branches/releases/1.0.X/django/db/models/fields/related.py
   django/branches/releases/1.0.X/tests/modeltests/custom_pk/models.py
Log:
[1.0.X] Fixed #10785 -- Corrected a case for foreign key lookup where the 
related object is a custom primary key. Thanks to Alex Gaynor for the patch.

Merge of r10952 from trunk.



Property changes on: django/branches/releases/1.0.X
___________________________________________________________________
Name: svnmerge-integrated
   - 
/django/trunk:1-9097,9099-9102,9104-9109,9111,9113-9144,9146-9151,9153-9156,9158-9159,9161-9187,9189-9247,9249-9262,9264-9277,9279-9298,9301-9302,9305-9331,9333-9343,9345,9347,9350-9352,9355-9396,9399-9462,9466-9469,9471-9488,9491-9526,9529,9533-9536,9539-9550,9556-9557,9559-9560,9562-9568,9570-9591,9595-9619,9621-9624,9626-9636,9638-9642,9644-9645,9647-9689,9691-9699,9703-9706,9709-9713,9716-9723,9725-9726,9730-9738,9740-9741,9750-9751,9757-9758,9761-9762,9767-9768,9770-9780,9782-9784,9789-9790,9793-9798,9801-9802,9806-9807,9809-9813,9821-9837,9842-9843,9847-9859,9861,9863-9875,9877-9881,9883-9887,9899-9903,9906-9909,9912,9914,9916-9917,9919-9920,9922-9927,9929,9931-9937,9939,9942-9943,9945-9950,9953-9954,9956-9962,9966-9977,9979-9984,9986-9988,9990-10001,10003-10004,10007,10009-10010,10013-10017,10019-10020,10022-10025,10031,10036-10041,10049-10052,10054-10061,10066-10069,10071-10076,10078-10079,10085-10087,10104,10106,10125-10127,10136,10138-10140,10143,10145-10147,10149-10160,10163-10167,10170,10173,10175-10176,10180,10185,10189,10192-10196,10198-10221,10223-10228,10230-10234,10236-10247,10250-10257,10259-10270,10273-10274,10276-10280,10282-10314,10316,10319-10322,10324-10325,10328-10329,10333-10344,10348-10351,10353-10356,10358-10363,10365-10368,10371-10380,10386-10407,10411,10413-10427,10429-10437,10440-10442,10444-10445,10447-10450,10452-10453,10457-10464,10466-10467,10469-10480,10482-10485,10489-10492,10495-10497,10499-10505,10508-10509,10511-10514,10517-10520,10524-10525,10528,10530-10537,10539-10548,10550-10557,10561,10563-10564,10567-10571,10573-10574,10576-10578,10580-10589,10591-10592,10595-10596,10599-10601,10603-10620,10624-10626,10631,10639-10641,10643,10646,10652-10655,10659-10660,10666-10669,10675,10682-10690,10693,10697-10704,10707,10713-10714,10723,10725,10727,10729,10732,10743-10750,10752-10760,10768,10770,10772,10774,10777,10782,10787,10789,10791,10795,10797,10799,10801,10805,10808,10810,10812,10814,10816,10819,10822,10828,10831,10833,10835,10837,10841,10843,10845,10847,10849,10913-10914
   + 
/django/trunk:1-9097,9099-9102,9104-9109,9111,9113-9144,9146-9151,9153-9156,9158-9159,9161-9187,9189-9247,9249-9262,9264-9277,9279-9298,9301-9302,9305-9331,9333-9343,9345,9347,9350-9352,9355-9396,9399-9462,9466-9469,9471-9488,9491-9526,9529,9533-9536,9539-9550,9556-9557,9559-9560,9562-9568,9570-9591,9595-9619,9621-9624,9626-9636,9638-9642,9644-9645,9647-9689,9691-9699,9703-9706,9709-9713,9716-9723,9725-9726,9730-9738,9740-9741,9750-9751,9757-9758,9761-9762,9767-9768,9770-9780,9782-9784,9789-9790,9793-9798,9801-9802,9806-9807,9809-9813,9821-9837,9842-9843,9847-9859,9861,9863-9875,9877-9881,9883-9887,9899-9903,9906-9909,9912,9914,9916-9917,9919-9920,9922-9927,9929,9931-9937,9939,9942-9943,9945-9950,9953-9954,9956-9962,9966-9977,9979-9984,9986-9988,9990-10001,10003-10004,10007,10009-10010,10013-10017,10019-10020,10022-10025,10031,10036-10041,10049-10052,10054-10061,10066-10069,10071-10076,10078-10079,10085-10087,10104,10106,10125-10127,10136,10138-10140,10143,10145-10147,10149-10160,10163-10167,10170,10173,10175-10176,10180,10185,10189,10192-10196,10198-10221,10223-10228,10230-10234,10236-10247,10250-10257,10259-10270,10273-10274,10276-10280,10282-10314,10316,10319-10322,10324-10325,10328-10329,10333-10344,10348-10351,10353-10356,10358-10363,10365-10368,10371-10380,10386-10407,10411,10413-10427,10429-10437,10440-10442,10444-10445,10447-10450,10452-10453,10457-10464,10466-10467,10469-10480,10482-10485,10489-10492,10495-10497,10499-10505,10508-10509,10511-10514,10517-10520,10524-10525,10528,10530-10537,10539-10548,10550-10557,10561,10563-10564,10567-10571,10573-10574,10576-10578,10580-10589,10591-10592,10595-10596,10599-10601,10603-10620,10624-10626,10631,10639-10641,10643,10646,10652-10655,10659-10660,10666-10669,10675,10682-10690,10693,10697-10704,10707,10713-10714,10723,10725,10727,10729,10732,10743-10750,10752-10760,10768,10770,10772,10774,10777,10782,10787,10789,10791,10795,10797,10799,10801,10805,10808,10810,10812,10814,10816,10819,10822,10828,10831,10833,10835,10837,10841,10843,10845,10847,10849,10913-10914,10952

Modified: django/branches/releases/1.0.X/django/db/models/fields/related.py
===================================================================
--- django/branches/releases/1.0.X/django/db/models/fields/related.py   
2009-06-08 04:50:24 UTC (rev 10952)
+++ django/branches/releases/1.0.X/django/db/models/fields/related.py   
2009-06-08 05:29:47 UTC (rev 10953)
@@ -132,12 +132,13 @@
                     v, field = getattr(v, v._meta.pk.name), v._meta.pk
             except AttributeError:
                 pass
-            if field:
-                if lookup_type in ('range', 'in'):
-                    v = [v]
-                v = field.get_db_prep_lookup(lookup_type, v)
-                if isinstance(v, list):
-                    v = v[0]
+            if not field:
+                field = self.rel.get_related_field()
+            if lookup_type in ('range', 'in'):
+                v = [v]
+            v = field.get_db_prep_lookup(lookup_type, v)
+            if isinstance(v, list):
+                v = v[0]
             return v
 
         if hasattr(value, 'as_sql'):
@@ -953,4 +954,3 @@
         # A ManyToManyField is not represented by a single column,
         # so return None.
         return None
-

Copied: django/branches/releases/1.0.X/tests/modeltests/custom_pk/fields.py 
(from rev 10952, django/trunk/tests/modeltests/custom_pk/fields.py)
===================================================================
--- django/branches/releases/1.0.X/tests/modeltests/custom_pk/fields.py         
                (rev 0)
+++ django/branches/releases/1.0.X/tests/modeltests/custom_pk/fields.py 
2009-06-08 05:29:47 UTC (rev 10953)
@@ -0,0 +1,54 @@
+import random
+import string
+
+from django.db import models
+
+class MyWrapper(object):
+    def __init__(self, value):
+        self.value = value
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__, self.value)
+
+    def __unicode__(self):
+        return self.value
+
+    def __eq__(self, other):
+        if isinstance(other, self.__class__):
+            return self.value == other.value
+        return self.value == other
+
+class MyAutoField(models.CharField):
+    __metaclass__ = models.SubfieldBase
+
+    def __init__(self, *args, **kwargs):
+        kwargs['max_length'] = 10
+        super(MyAutoField, self).__init__(*args, **kwargs)
+
+    def pre_save(self, instance, add):
+        value = getattr(instance, self.attname, None)
+        if not value:
+            value = MyWrapper(''.join(random.sample(string.lowercase, 10)))
+            setattr(instance, self.attname, value)
+        return value
+
+    def to_python(self, value):
+        if not value:
+            return
+        if not isinstance(value, MyWrapper):
+            value = MyWrapper(value)
+        return value
+
+    def get_db_prep_save(self, value):
+        if not value:
+            return
+        if isinstance(value, MyWrapper):
+            return unicode(value)
+        return value
+
+    def get_db_prep_value(self, value):
+        if not value:
+            return
+        if isinstance(value, MyWrapper):
+            return unicode(value)
+        return value

Modified: django/branches/releases/1.0.X/tests/modeltests/custom_pk/models.py
===================================================================
--- django/branches/releases/1.0.X/tests/modeltests/custom_pk/models.py 
2009-06-08 04:50:24 UTC (rev 10952)
+++ django/branches/releases/1.0.X/tests/modeltests/custom_pk/models.py 
2009-06-08 05:29:47 UTC (rev 10953)
@@ -9,6 +9,8 @@
 from django.conf import settings
 from django.db import models, transaction, IntegrityError
 
+from fields import MyAutoField
+
 class Employee(models.Model):
     employee_code = models.IntegerField(primary_key=True, db_column = 'code')
     first_name = models.CharField(max_length=20)
@@ -28,6 +30,16 @@
     def __unicode__(self):
         return self.name
 
+class Bar(models.Model):
+    id = MyAutoField(primary_key=True, db_index=True)
+
+    def __unicode__(self):
+        return repr(self.pk)
+
+
+class Foo(models.Model):
+    bar = models.ForeignKey(Bar)
+
 __test__ = {'API_TESTS':"""
 >>> dan = Employee(employee_code=123, first_name='Dan', last_name='Jones')
 >>> dan.save()
@@ -121,6 +133,21 @@
 ...        print "Fail with %s" % type(e)
 Pass
 
+# Regression for #10785 -- Custom fields can be used for primary keys.
+>>> new_bar = Bar.objects.create()
+>>> new_foo = Foo.objects.create(bar=new_bar)
+>>> f = Foo.objects.get(bar=new_bar.pk)
+>>> f == new_foo
+True
+>>> f.bar == new_bar
+True
+
+>>> f = Foo.objects.get(bar=new_bar)
+>>> f == new_foo
+True
+>>> f.bar == new_bar
+True
+
 """}
 
 # SQLite lets objects be saved with an empty primary key, even though an


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to