#21903: Query with select_related and defer on MySQL causes id field to be
returned
as bool
-------------------------------+--------------------
Reporter: matklad | Owner: nobody
Type: Bug | Status: new
Component: Uncategorized | Version: 1.6
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------
I selected an object `obj` by a query with select_related and defer, to
find out that `obj.user.id` is `True` instead of `1`. Technically, `True
== 1`, but it doesn't work with, for example, url reversing. I managed to
reproduce this behaviour on MySQL, python2 and python3. With SQLite I get
`1` as expected. Here is a test case that show this surprising behaviour:
models.py
{{{
from django.conf import settings
from django.db import models
class A(models.Model):
dspam = models.TextField()
eggs = models.BooleanField(default=False)
class B(models.Model):
a = models.ForeignKey(A)
class C(models.Model):
b = models.ForeignKey(B)
class D(models.Model):
c = models.ForeignKey(C)
dfoo = models.TextField()
dbar = models.TextField()
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)
time = models.DateTimeField(null=True)
class E(models.Model):
d = models.ForeignKey(D)
dbaz = models.TextField()
}}}
test.py
{{{
from django.contrib.auth.models import User
from django.test import TestCase
from .models import *
class Test(TestCase):
def setUp(self):
self.a = A.objects.create()
self.b = B.objects.create(a=self.a)
self.c = C.objects.create(b=self.b)
self.user = User.objects.create_user("foo", "[email protected]",
password="424242", id=1)
self.d = D.objects.create(c=self.c, user=self.user)
self.e = E.objects.create(d=self.d)
def test(self):
qs = (E.objects
.select_related('d__user', 'd__c__b__a')
.filter(d__c__b=self.b, d__user_id=1)
.defer('dbaz', 'd__dfoo', 'd__dbar',
'd__c__b__a__dspam'))
user = qs[0].d.user
print(user.id) # prints True. Technically it is an Int, but bools
don't work with, for example, url reversing
}}}
pip freeze
{{{
Django==1.6.1
MySQL-python==1.2.5
wsgiref==0.1.2
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/21903>
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.39ea66720fe8a448784ed6608c5a4723%40djangoproject.com.
For more options, visit https://groups.google.com/groups/opt_out.