﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
21903	Query with select_related and defer on MySQL causes id field to be returned as bool	Aleksey Kladov	nobody	"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"", ""foo.bar@example.com"", 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
}}}"	Bug	closed	Database layer (models, ORM)	1.6	Normal	fixed			Ready for checkin	0	0	0	0	0	0
