#14518: Field.to_python not called on foreign key IDs
-------------------------------------+-------------------------------------
     Reporter:  wolever              |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  1.2
  (models, ORM)                      |               Resolution:
     Severity:  Normal               |             Triage Stage:  Accepted
     Keywords:                       |      Needs documentation:  0
    Has patch:  0                    |  Patch needs improvement:  0
  Needs tests:  0                    |                    UI/UX:  0
Easy pickings:  0                    |
-------------------------------------+-------------------------------------

Comment (by anubhav9042):

 Well there have been some changes in the code and some things have
 changed.
 Here is my models.py

 {{{
 from django.db import models


 class MyField(models.CharField):
         __metaclass__ = models.SubfieldBase

         def __init__(self, *args, **kwargs):
                 super(MyField, self).__init__(*args, **kwargs)

         def to_python(self, value):
                 return "Value: %s" % value


 class Foo(models.Model):
         field = MyField(max_length=30, primary_key=True)

 class Bar(models.Model):
     foo = models.ForeignKey(Foo)

 }}}

 In shell, I get correct values here:
 {{{
 >>> m1 = Foo.objects.create(field="anubhavjoshi")
 >>> m2 = Bar.objects.create(foo=m1)
 >>> m2.foo_id
 u'Value: Value: anubhavjoshi'
 >>> m2.foo.field
 u'Value: Value: anubhavjoshi'
 }}}

 But if I do:
 {{{
 >>> m1 = Foo.objects.create(field="anubhavjoshi")
 >>> m2 = Bar.objects.create(foo=m1)
 >>> m2 = Bar.objects.all()[0]
 >>> m2.foo_id
 u'Value: Value: anubhavjoshi'
 >>> m2.foo.field
 DoesNotExist: Foo matching query does not exist.
 >>> m2.foo
 DoesNotExist: Foo matching query does not exist.
 }}}

 Following traceback:
 {{{
 ---------------------------------------------------------------------------
 DoesNotExist                              Traceback (most recent call
 last)
 C:\Users\Anubhav\DjangoDev\apps\<ipython-input-7-3a4a21c18010> in
 <module>()
 ----> 1 m2.foo

 c:\users\anubhav\django\django\db\models\fields\related.pyc in
 __get__(self, instance, instance_type)
     562                     qs = qs.filter(extra_filter, **params)
     563                 # Assuming the database enforces foreign keys,
 this won't fail.

 --> 564                 rel_obj = qs.get()
     565                 if not self.field.rel.multiple:
     566                     setattr(rel_obj,
 self.field.related.get_cache_name(), instance)

 c:\users\anubhav\django\django\db\models\query.pyc in get(self, *args,
 **kwargs)
     374             raise self.model.DoesNotExist(
     375                 "%s matching query does not exist." %
 --> 376                 self.model._meta.object_name)
     377         raise self.model.MultipleObjectsReturned(
     378             "get() returned more than one %s -- it returned %s!" %
 (
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/14518#comment:7>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.a8e14afad37a7bf1825708bbd711456f%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to