Column aliases aren't being generated for columns with conflicting names. This causes problems in Oracle when doing pagination, which effectively wraps the query in "SELECT * FROM (%s)". Here's an example, where the test_species.id and test_genus.id columns conflict, as well as the test_species.name and test_genus.name columns:
In [5]: qs = Species.objects.all().select_related(depth=1)[:5]
In [6]: qs.query.as_sql()
Out[6]:
('SELECT * FROM (SELECT (ROW_NUMBER() OVER (ORDER BY "TEST_SPECIES"."ID" )) AS rn, "TEST_SPECIES"."ID", "TEST_SPECIES"."NAME", "TEST_SPECIES"."GENUS_ID", "TEST_GENUS"."ID", "TEST_GENUS"."NAME", "TEST_GENUS"."FAMILY_ID", "TEST_SPECIES"."ID", "TEST_SPECIES"."NAME", "TEST_SPECIES"."GENUS_ID", "TEST_GENUS"."ID", "TEST_GENUS"."NAME", "TEST_GENUS"."FAMILY_ID" FROM "TEST_SPECIES" INNER JOIN "TEST_GENUS" ON ("TEST_SPECIES"."GENUS_ID" = "TEST_GENUS"."ID")) WHERE rn > 0 AND rn <= 5',
())
In [7]: list(qs)
...
<class 'cx_Oracle.DatabaseError'>: ORA-00918: column ambiguously defined