¿Cómo recorrer una GenericForeignKey en Django?

Estoy usando Django v1.9.4 con PostgreSQL 9.2.14 detrás. Con los siguientes modelos:

from django.db import models
from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Foo(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    bar = GenericForeignKey('content_type', 'object_id')

class Bar(models.Model):
    foos = GenericRelation(Foo, related_query_name='bars')
    class Meta:
        abstract = True

class BarX(Bar):
    name = models.CharField(max_length=10, default='bar x')

class BarY(Bar):
    name = models.CharField(max_length=10, default='bar y')

Crea algunas instancias para demostrar mi problema:

>>> bar_x = BarX.objects.create()
>>> bar_y = BarY.objects.create()
>>> foo1 = Foo.objects.create(bar=bar_x)
>>> foo2 = Foo.objects.create(bar=bar_y)
>>> foo1.bar.name
u'bar x'
>>> foo2.bar.name
u'bar y'

No puedo atravesar el GFK en django, intentar filtrar genera una excepción con un mensaje que sugiere agregar elGenericRelation. Pero usando la relación genérica, a través del nombre de consulta relacionadobars, no funciona de manera confiable. Por ejemplo:

>>> [foo.bar.name for foo in Foo.objects.all()]
[u'bar x', u'bar y']  # in a pure python loop, it's working
>>> Foo.objects.filter(bar__name='bar x')
FieldError: Field 'bar' does not generate an automatic reverse relation and therefore cannot be used for reverse querying. If it is a GenericForeignKey, consider adding a GenericRelation.
>>> Foo.objects.values_list('bars__name', flat=1)
[None, u'bar y']   # but why None is returned in here?
>>> Foo.objects.filter(bars__name='bar x')
[]  # why no result here?
>>> Foo.objects.filter(bars__name='bar y')
[<Foo: Foo object>]  # but this one works?

¿Qué estoy haciendo mal?

Nota de precaución para futuros lectores: Templarrelated_query_name enGenericRelation no funciona correctamente en Django 1.9.

Agregado en Django 1.10 fuerelated_query_name ahora admite la interpolación de etiquetas y clases de la aplicación utilizando las cadenas '% (app_label) s' y '% (class) s', después de lareparar para# 25354 fue fusionado

Si estás en Django 1.10, puedes seguir adelante y poner elGenericRelation en la clase base abstracta y la plantilla que le gustarelated_query_name='%(app_label)s_%(class)s' para garantizar la unicidad en todas las subclases.

Respuestas a la pregunta(1)

Su respuesta a la pregunta