-
Notifications
You must be signed in to change notification settings - Fork 53
Open
Description
Given an M2M model which uses a db_column, the SQL code generated by django_cte does not account for the column name. I'd expect a CTE join to join on oid in the example below as that is the db_column value. But the join is specified on treenode_id.
The issue arises, I think, here:
Lines 61 to 68 in 61d5311
| def as_sql(self, compiler, connection): | |
| qn = compiler.quote_name_unless_alias | |
| ref = self._ref | |
| if isinstance(ref, Col) and self.name == "pk": | |
| column = ref.target.column | |
| else: | |
| column = self.name | |
| return "%s.%s" % (qn(self.table_alias), qn(column)), [] |
class TreenodeUserClosure(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, db_column="uid")
treenode = models.ForeignKey(TreeNode, db_column="oid")The code generated by django_cte does not account for the db_column
cte = With(
TreenodeUserClosure.objects.values("treenode_id").filter(user_id=uid)
)
cte.join(CouchDocCte, treenode_id=cte.col.treenode_id).with_cte(cte)
Raises
ProgrammingError: column cte.treenode_id does not exist
LINE 1: ..." INNER JOIN "cte" ON "couchdoc"."treenode_id" = ("cte"."tre...
^
The code generated by the queryset was:
In [3]: TreenodeUserClosureCte.joined(491).query.sql_with_params()
Out[3]:
('WITH RECURSIVE "cte" AS (SELECT "userorgs"."oid" FROM "userorgs" WHERE "userorgs"."uid" = %s) SELECT "couchdoc"."rid", "couchdoc"."clocked_at", "couchdoc"."received_at", "couchdoc"."replaced_at", "couchdoc"."replaced_by", "couchdoc"."deleted_at", "couchdoc"."user_id", "couchdoc"."treenode_id", "couchdoc"."meta", "couchdoc"."attachments", "couchdoc"."odkresponse" FROM "couchdoc" INNER JOIN "cte" ON "couchdoc"."treenode_id" = ("cte"."treenode_id")',
(491,))
Metadata
Metadata
Assignees
Labels
No labels