2010-03-30 9 views
1

Je dispose d'un fichier de modèles qui ressemble à ce qui suit:ChampErreur lorsque annoter sur les clés étrangères

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) 

Pour chaque match, je suis en train d'obtenir un compte de notifier les dossiers qui ont un titre. Donc, mon appel ressemble à

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

Ceci continue de lancer une erreur de champ. J'ai simplifié la requête vers le bas pour

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

Et je reçois toujours le même ChampErreur ... Je l'ai vu ce travail dans d'autres cas (d'autres documents, d'autres questions telles que SO this one) mais je ne peux pas pourquoi je reçois une erreur.

L'erreur spécifique qui est retournée est la suivante:

Cannot resolve keyword 'notify' into field. Choices are: (all fields from Match model)

Quelqu'un at-il la moindre idée de la raison pour laquelle je ne peux pas obtenir cette annotation à travailler sur les tables? Je suis déconcerté après avoir regardé l'autre question SO et divers documents Django où j'ai vu cela fait.

Edit: J'utilise Django 1.1.1

Edit 2: J'ai essayé de renommer le champ matchId pour correspondre juste ... et je l'ai éliminé la classe WithDate, en ajoutant dans la ligne droite addedDate et ModifiedDate dans les définitions de classe de modèle. Aucun de ces changements ne s'est débarrassé du message d'erreur.

Edit 3: Après la reconstruction de mes modèles morceau de fichier par pièce, je me suis rendu l'inclusion de plug-in django-filtre Alex Gaynor a été l'origine du problème. Je ne pensais pas que cela était pertinent au début, mais comme c'est maintenant le cas, j'ai inclus la classe Match FilterSet qui provoque l'erreur. Lorsque je supprime la classe MatchFilter, cela fonctionne très bien. J'essaie de passer en revue le code du filtre django pour comprendre pourquoi cela se passe, mais si quelqu'un d'autre a une idée, je serais très intéressé!

+0

ce n'est pas pertinent à votre problème, mais vous avez une erreur d'indentation dans 'MatchFilter'. –

+0

Oups, le transfert de code à la boîte de texte n'est pas allé aussi proprement que je le pensais. Merci d'avoir fait remarquer cela. Devrait être réparé maintenant! –

Répondre

0

Il semble que le problème était le MatchFilter était défini avant le modèle Signalés dans le fichier models.py. Une fois que je réarrangé le fichier comme suit ...

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 

Je ne pouvais plus faire le ChampErreur.

0

Le nom par défaut pour une relation inverse est modelname _set, donc vous devriez essayer:

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

ou mieux, ajouter un related name à la déclaration des champs, puis utilisez la requête que vous avez écrit:

matchId = models.ForeignKey(Match, related_name='notify') 
+0

Il me donne encore un ChampErreur: « Impossible de résoudre le mot-clé « notify_set » dans le champ. » Erreur. Il en va de même lorsque j'essaie d'ajouter le paramètre related_name et d'utiliser simplement 'notify'. –