我有一个类似于以下内容的模型文件:
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代码来弄清楚为什么会这样,但如果有其他人有想法,我会非常感兴趣!
答案 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。