FieldError при аннотировании внешних ключей - PullRequest
1 голос
/ 30 марта 2010

У меня есть файл моделей, который выглядит примерно так:

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)

Для каждого матча я пытаюсь получить количество записей уведомлений с заголовком. Так что мой звонок выглядит как

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

Это продолжает генерировать FieldError. Я упростил запрос до

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

И я все еще получаю ту же FieldError ... Я видел эту работу в других случаях (другая документация, другие вопросы SO, такие как этот ), но я не могу понять, почему я получаю ошибку.

Конкретная ошибка, которая возвращается:

Невозможно разрешить ключевое слово "notify" в поле. Варианты выбора: (все поля из модели соответствия)

Кто-нибудь знает, почему я не могу заставить эту аннотацию работать между таблицами? Я сбит с толку после просмотра другого SO вопроса и различных документов Django, где я видел, как это было сделано.

Редактировать: я использую Django 1.1.1

Редактировать 2: я попытался переименовать поле matchId, чтобы оно просто совпадало ... и я исключил класс WithDate, добавив addDate иifiedDate прямо в определения класса модели. Ни одно из этих изменений не избавилось от сообщения об ошибке.

Редактировать 3: После реконструкции файла моих моделей по частям, я понял, что включение плагина django-фильтра Алекса Гейнора вызывало проблему. Сначала я не думал, что это актуально, но так как сейчас, я включил класс Match FilterSet, который вызывает ошибку. Когда я удаляю класс MatchFilter, он работает просто отлично. Я пытаюсь пройти через код фильтра django, чтобы выяснить, почему это происходит, но если у кого-то есть идея, мне будет очень интересно!

Ответы [ 2 ]

0 голосов
/ 31 марта 2010

Похоже, проблема заключалась в том, что MatchFilter определялся до модели Notify в файле models.py. Однажды я переставил файл так, чтобы он читался следующим образом ...

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

Я больше не получаю FieldError.

0 голосов
/ 31 марта 2010

Имя по умолчанию для обратного отношения - имя модели _set, поэтому вы должны попробовать:

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

или лучше, добавьте связанное имя в объявление полей, а затем используйте написанный вами запрос:

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