Pergunta

Eu tenho um arquivo de modelos que se parece com o seguinte:

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 partida, estou tentando obter uma contagem de registros notificados que têm uma manchete. Então minha chamada se parece

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

Isso continua jogando um fielderror. Eu simplifiquei a consulta para

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

E eu ainda recebo o mesmo Fielderror ... Eu vi esse trabalho em outros casos (outra documentação, outras perguntas como Este) Mas não consigo descobrir por que estou recebendo um erro.

O erro específico que é retornado é o seguinte:

Não é possível resolver a palavra -chave 'notificar' no campo. As opções são: (todos os campos do Match Model)

Alguém tem uma idéia de por que não consigo fazer com que essa anotação funcione em mesas? Estou confuso depois de olhar para o outro, então pergunta e vários documentos de Django onde eu vi isso feito.

EDIT: Estou usando o Django 1.1.1

EDIT 2: Eu tentei renomear o campo MatchID para combinar ... e eliminei a classe Withdate, adicionando o AddedDate e o ModifiedDate diretamente nas definições da classe Model. Nenhuma dessas mudanças se livrou da mensagem de erro.

EDIT 3: Depois de reconstruir o arquivo de meus modelos, peça por peça, percebi que a inclusão do plug-in de Alex Gaynor Django-Filter estava causando o problema. Eu não achei que isso fosse relevante no início, mas como agora é, incluí a classe Filterset de Match que causa o erro. Quando eu removo a classe Matchfilter, ele funciona muito bem. Estou tentando passar pelo código de filtro do Django para descobrir por que isso está acontecendo, mas se alguém mais tiver uma ideia, estaria muito interessado!

Foi útil?

Solução 2

Parece que o problema era que o Filter Matchfilter estava sendo definido antes do modelo Notify no arquivo models.py. Depois que reorganizei o arquivo para ler o seguinte ...

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

Eu não estava mais recebendo o Fielderror.

Outras dicas

O nome padrão para uma relação reversa é ModelName_set, então você deve tentar:

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

ou melhor, adicione um nome relacionado para a declaração dos campos e depois use a consulta que você escreveu:

matchId = models.ForeignKey(Match, related_name='notify')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top