注释外键时的FieldError

时间:2010-03-30 17:05:09

标签: django orm django-filter

我有一个类似于以下内容的模型文件:

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问题,如this one),但我无法弄清楚为什么我收到错误

返回的具体错误如下:

  

无法将关键字'notify'解析为字段。选择是:(匹配模型中的所有字段)

有没有人知道为什么我不能让这个注释跨表工作?看完另一个SO问题和各种Django文档之后我感到困惑,我已经看到了这一点。

编辑:我正在使用Django 1.1.1

编辑2:我已经尝试将matchId字段重命名为仅匹配...我已经删除了WithDate类,将addedDate和modifiedDate直接添加到模型类定义中。这些更改都没有消除错误消息。

编辑3:在逐个重建我的模型文件之后,我意识到包含Alex Gaynor的django-filter插件导致了这个问题。我一开始并不认为这是相关的,但是现在它已经包含了导致错误的Match FilterSet类。当我删除MatchFilter类时,它工作得很好。我正在尝试通过django-filter代码来弄清楚为什么会这样,但如果有其他人有想法,我会非常感兴趣!

2 个答案:

答案 0 :(得分:0)

反向关系的默认名称是 modelname _set,因此您应该尝试:

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

或更好,在字段声明中添加related name,然后使用您编写的查询:

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

答案 1 :(得分:0)

似乎问题是在models.py文件中的Notify模型之前定义了MatchFilter。一旦我重新安排文件阅读如下...

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。