Pregunta

Tengo un archivo de modelos que se parece a lo siguiente:

class WithDate(models.Model):
    addedDate = models.DateTimeField(auto_now_add=True)
    modifiedDate = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Match(WithDate):
    ...

class MatchFilter(django_filters.FilterSet):
    class Meta:
        model = Match

class Notify(WithDate):
    matchId = models.ForeignKey(Match)
    headline = models.CharField(null=True, blank=True, max_length=10)

Para cada encuentro, estoy tratando de obtener un conteo de notificar a los registros que tienen un titular. Así que mis llamadas se parece a

matchObjs = Match.objects.annotate(notifies_made=Count('notify__headline__isnull'))

Esto mantiene lanzando una FieldError. He simplificado la consulta a

matchObjs = Match.objects.annotate(notifies_made=Count('notify'))

Y sigo teniendo la misma FieldError ... que he visto este trabajo en otros casos (otra documentación, otras preguntas tan parecida éste ) pero no puedo averiguar por qué estoy recibiendo un error.

El error específico que se devuelve es como sigue:

  

No se puede resolver la palabra clave 'notificar' en el campo. Las opciones son: (todos los campos de modelo de ajuste)

¿Alguien tiene una idea de por qué no puedo conseguir esta anotación a través de mesas de trabajo? Estoy desconcertado después de mirar la otra pregunta SO y varios documentos de Django en el que he visto este hecho.

Editar: Estoy utilizando Django 1.1.1

Edición 2: He intentado cambiar el nombre del campo matchId a solo partido ... y he eliminado la clase WithDate, añadiendo en el addedDate y ModifiedDate directamente en las definiciones de clase de modelo. Ninguno de estos cambios se deshizo del mensaje de error.

Editar 3: Después de la reconstrucción de mis modelos pieza archivo por pieza, I dio cuenta de la inclusión de django-filtro plug-in de Alex Gaynor fue la causa del problema. No creía que esto era relevante al principio, pero ya que ahora es, he incluido la clase de ajuste de FILTERSET que causa el error. Cuando quito la clase MatchFilter, funciona muy bien. Estoy tratando de pasar por el código de Django-filtro para averiguar por qué ocurre esto, pero si alguien tiene una idea, estaría muy interesado!

¿Fue útil?

Solución 2

Parece que el problema fue la MatchFilter estaba siendo definido antes de que el modelo Notificar en el archivo models.py. Una vez reacomodé el archivo de la siguiente manera ...

class WithDate(models.Model):
    addedDate = models.DateTimeField(auto_now_add=True)
    modifiedDate = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Match(WithDate):
    ...

class Notify(WithDate):
    matchId = models.ForeignKey(Match)
    headline = models.CharField(null=True, blank=True, max_length=10)

class MatchFilter(django_filters.FilterSet):
    class Meta:
        model = Match

Ya no estaba recibiendo el FieldError.

Otros consejos

El nombre predeterminado para una relación inversa es ModelName _ID, lo que debe tratar:

matchObjs = Match.objects.annotate(notifies_made=Count('notify_set'))

o mejor, añadir un nombre relacionado a la declaración de los campos, y luego usar la consulta que escribió:

matchId = models.ForeignKey(Match, related_name='notify')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top