Django ORM crea un alias fantasma en la unión SQL
-
06-07-2019 - |
Pregunta
Estoy ejecutando el siguiente código (los nombres se cambiaron para proteger a los inocentes, por lo que la estructura del modelo puede parecer extraña):
memberships =
models.Membership.objects.filter(
degree__gt=0.0,
group=request.user.get_profile().group
)
exclude_count =
memberships.filter(
member__officerships__profile=request.user.get_profile()
).count()
if exclude_officers_with_profile:
memberships = memberships.exclude(
member__officerships__profile=request.user.get_profile()
)
total_count = memberships.count()
que en este punto da como resultado:
OperationalError at /
(1054, "Unknown column 'U1.id' in 'on clause'")
El SQL generado es:
SELECT
COUNT(*)
FROM
`membership`
WHERE (
`membership`.`group_id` = 2 AND
`membership`.`level` > 0.0 AND
NOT (
`membership`.`member_id`
IN (
SELECT
U2.`member_id`
FROM
`membership` U0 INNER JOIN `officers` U2
ON (U1.`id` = U2.`member_id`)
WHERE U2.`profile_id` = 2
)
)
)
Parece que la instrucción ON de SQL Join hace referencia a un alias que no se ha definido. ¿Alguna idea de por qué? Dejé caer mi base de datos MySQL y volví a sincronizar las tablas de mis modelos para intentar asegurarme de que no hubiera inconsistencias allí.
La estructura de los modelos que estoy usando son:
class Membership(models.Model):
member = models.ForeignKey(Member, related_name='memberships')
group = models.ForeignKey(Group, related_name='memberships')
level = models.FloatField(default=0.0)
class Member(models.Model):
name = models.CharField(max_length=32)
class Officer(models.Model):
member = models.ForeignKey(Member, related_name='officerships')
profile = models.ForeignKey(UserProfile)
class UserProfile(models.Model)
group = models.ForeignKey(Group)
class Group(models.Model)
pass
Solución
Creo que esto puede ser un síntoma de:
http://code.djangoproject.com/ticket/9188
que se corrigió a partir de la revisión 9589 de django, creo. Ahora cómo averiguar de qué revisión estoy trabajando ...
Confirmado. Cuando implementé el cambio al que se hace referencia en el ticket anterior:
http://code.djangoproject.com/changeset/9589
mi error desapareció.