#25361: Unpickling of QuerySet fails in presence of abstract intermediate model
----------------------------------------------+--------------------
     Reporter:  bronger                       |      Owner:  nobody
         Type:  Bug                           |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:  1.8
     Severity:  Normal                        |   Keywords:
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+--------------------
 Consider the following model hierarchy:


 {{{
 from django.db import models

 class Pizza(models.Model):
     timestamp = models.DateTimeField("last modified", auto_now=True)

 class SpecialPizza(Pizza):
     class Meta:
         abstract = True
         ordering = ["timestamp"]

 class MyPizza(SpecialPizza):
     pass

 class Topping(models.Model):
     pizza = models.ForeignKey(MyPizza, related_name="toppings")

     class Meta:
         ordering = ["pizza"]
 }}}

 QuerySet objects containing MyPizza objects with Toppings cannot be
 pickled and unpickled:


 {{{
 my_pizza = models.MyPizza.objects.create()
 my_pizza.toppings.add(models.Topping())
 pickled = pickle.dumps(my_pizza.toppings.all())
 response = pickle.loads(pickled)
 }}}

 The traceback is:


 {{{
 Traceback:
 File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py"
 in get_response
   132.                     response = wrapped_callback(request,
 *callback_args, **callback_kwargs)
 File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py"
 in inner
   145.                     return func(*args, **kwargs)
 File "/tmp/myproject/myproject/myapp/views.py" in test
   9.     response = pickle.loads(pickled)
 File "/usr/lib/python2.7/pickle.py" in loads
   1383.     return Unpickler(file).load()
 File "/usr/lib/python2.7/pickle.py" in load
   858.                 dispatch[key](self)
 File "/usr/lib/python2.7/pickle.py" in load_reduce
   1134.         value = func(*args)
 File "/usr/local/lib/python2.7/dist-
 packages/django/db/models/fields/__init__.py" in _load_field
   66.     return apps.get_model(app_label,
 model_name)._meta.get_field(field_name)
 File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py" in
 get_model
   202.         return
 self.get_app_config(app_label).get_model(model_name.lower())
 File "/usr/local/lib/python2.7/dist-packages/django/apps/config.py" in
 get_model
   162.                 "App '%s' doesn't have a '%s' model." %
 (self.label, model_name))

 Exception Type: LookupError at /
 Exception Value: App 'myapp' doesn't have a 'specialpizza' model.
 }}}

 If one removes one of the "ordering" fields, the unpickler uses "MyPizza"
 instead of "SpecialPizza", which is correct and should always be the case.

--
Ticket URL: <https://code.djangoproject.com/ticket/25361>
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/050.b12f9bf9d2eeaccbce1643db4a5135a3%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to