#31926: missing FROM-clause entry when unpickling queries with FilteredRelation
-------------------------------------+-------------------------------------
Reporter: Beda | Owner: nobody
Kosata |
Type: Bug | Status: new
Component: Database | Version: 2.2
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
I am pickling query objects (queryset.query) for later re-evaluation as
per https://docs.djangoproject.com/en/2.2/ref/models/querysets/#pickling-
querysets. However, when I tried to rerun a query that contains a {{{
FilteredRelation }}} inside a filter, I get an {{{
psycopg2.errors.UndefinedTable: missing FROM-clause entry for table "t3"
}}} error.
I created a minimum reproducible example.
**models.py**
{{{
from django.db import models
class Publication(models.Model):
title = models.CharField(max_length=64)
class Session(models.Model):
TYPE_CHOICES = (('A', 'A'), ('B', 'B'))
publication = models.ForeignKey(Publication, on_delete=models.CASCADE)
session_type = models.CharField(choices=TYPE_CHOICES, default='A',
max_length=1)
place = models.CharField(max_length=16)
value = models.PositiveIntegerField(default=1)
}}}
**The actual code to cause the crash**:
{{{
import pickle
from django.db.models import FilteredRelation, Q, Sum
from django_error.models import Publication, Session
p1 = Publication.objects.create(title='Foo')
p2 = Publication.objects.create(title='Bar')
Session.objects.create(publication=p1, session_type='A', place='X',
value=1)
Session.objects.create(publication=p1, session_type='B', place='X',
value=2)
Session.objects.create(publication=p2, session_type='A', place='X',
value=4)
Session.objects.create(publication=p2, session_type='B', place='X',
value=8)
Session.objects.create(publication=p1, session_type='A', place='Y',
value=1)
Session.objects.create(publication=p1, session_type='B', place='Y',
value=2)
Session.objects.create(publication=p2, session_type='A', place='Y',
value=4)
Session.objects.create(publication=p2, session_type='B', place='Y',
value=8)
qs = Publication.objects.all().annotate(
relevant_sessions=FilteredRelation('session',
condition=Q(session__session_type='A'))
).annotate(x=Sum('relevant_sessions__value'))
# just print it out to make sure the query works
print(list(qs))
qs2 = Publication.objects.all()
qs2.query = pickle.loads(pickle.dumps(qs.query))
# the following crashes with an error
# psycopg2.errors.UndefinedTable: missing FROM-clause entry for table
"t3"
# LINE 1: ...n"."id" = relevant_sessions."publication_id" AND
(T3."sessio...
print(list(qs2))
}}}
In the crashing query, there seems to be a difference in the {{{ table_map
}}} attribute - this is probably where the {{{ t3 }}} table is coming
from.
Please let me know if there is any more info required for hunting this
down.
Cheers
Beda
p.s.- I also tried in Django 3.1 and the behavior is the same.
p.p.s.- just to make sure, I am not interested in ideas on how to rewrite
the query - the above is a very simplified version of what I use, so it
would probably not be applicable anyway.
--
Ticket URL: <https://code.djangoproject.com/ticket/31926>
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 view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/049.33e4437982dcd2d09dfb1547f866c581%40djangoproject.com.