Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revision 6360)
+++ django/db/models/query.py	(working copy)
@@ -501,7 +501,7 @@
 
         # Add additional tables and WHERE clauses based on select_related.
         if self._select_related:
-            fill_table_cache(opts, select, tables, where,
+            fill_table_cache(self.model, select, tables, where,
                              old_prefix=opts.db_table,
                              cache_tables_seen=[opts.db_table],
                              max_depth=self._max_related_depth)
@@ -845,7 +845,7 @@
                 setattr(obj, f.get_cache_name(), rel_obj)
     return obj, index_end
 
-def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen, max_depth=0, cur_depth=0):
+def fill_table_cache(cls, select, tables, where, old_prefix, cache_tables_seen, max_depth=0, cur_depth=0):
     """
     Helper function that recursively populates the select, tables and where (in
     place) for select_related queries.
@@ -855,9 +855,11 @@
     if max_depth and cur_depth > max_depth:
         return None
 
+    opts = cls._meta
     qn = connection.ops.quote_name
     for f in opts.fields:
-        if f.rel and not f.null:
+        # we only visit FKs, and exclude those that can be null and those who point to our own Model
+        if f.rel and not f.null and f.rel.to != cls:
             db_table = f.rel.to._meta.db_table
             if db_table not in cache_tables_seen:
                 tables.append(qn(db_table))
@@ -869,7 +871,7 @@
             where.append('%s.%s = %s.%s' % \
                 (qn(old_prefix), qn(f.column), qn(db_table), qn(f.rel.get_related_field().column)))
             select.extend(['%s.%s' % (qn(db_table), qn(f2.column)) for f2 in f.rel.to._meta.fields])
-            fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen, max_depth, cur_depth+1)
+            fill_table_cache(f.rel.to, select, tables, where, db_table, cache_tables_seen, max_depth, cur_depth+1)
 
 def parse_lookup(kwarg_items, opts):
     # Helper function that handles converting API kwargs
Index: tests/modeltests/select_related/models.py
===================================================================
--- tests/modeltests/select_related/models.py	(revision 6360)
+++ tests/modeltests/select_related/models.py	(working copy)
@@ -75,6 +75,16 @@
         obj.save()
         parent = obj
 
+# tests that select_related doesn't follow this kind of FK 
+class Foo(models.Model):
+    parent = models.ForeignKey('self')
+
+class ALoop(models.Model):
+    b = models.ForeignKey('BLoop')
+
+class BLoop(models.Model):
+    a = models.ForeignKey('BLoop')
+
 __test__ = {'API_TESTS':"""
 
 # Set up.
@@ -83,6 +93,16 @@
 >>> from django.conf import settings
 >>> settings.DEBUG = True
 
+# simply verify that it's possible en enable select related on this model 
+>>> Foo.objects.all().select_related()
+[]
+
+# simply verify that it's possible en enable select related on this model 
+>>> ALoop.objects.all().select_related()
+[]
+>>> BLoop.objects.all().select_related()
+[]
+
 >>> create_tree("Eukaryota Animalia Anthropoda Insecta Diptera Drosophilidae Drosophila melanogaster")
 >>> create_tree("Eukaryota Animalia Chordata Mammalia Primates Hominidae Homo sapiens")
 >>> create_tree("Eukaryota Plantae Magnoliophyta Magnoliopsida Fabales Fabaceae Pisum sativum")
