2010-03-30 85 views
1

时,我有一个模型文件看起来类似于以下内容:FieldError注释过的外键

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 ......我见过在其他情况下,这项工作(其他文件,其他等问题,如this one),但我不明白为什么我得到一个错误。

返回的特定错误如下:

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

有没有人有一个线索,为什么我不能得到这个注释跨表的工作?看到其他的SO问题以及我看到完成的各种Django文档后,我感到困惑不解。

编辑:我使用Django 1.1.1

编辑2:我已经试过重新命名matchId场只是比赛......我已经消除了WithDate类,添加在addedDate和modifiedDate直进入模型类定义。这些更改都没有摆脱错误消息。

编辑3:一块重建我的模型文件片之后,我认识亚历克斯Gaynor的Django的过滤插件的加入是造成问题。我一开始并不认为这是相关的,但是现在它已经包含了导致错误的Match FilterSet类。当我删除MatchFilter类时,它工作得很好。我试图通过django过滤器代码来弄清楚为什么会发生这种情况,但如果有其他人有想法,我会非常感兴趣!

+0

它与您的问题无关,但在MatchFilter中存在缩进错误。 – 2010-03-31 14:44:07

+0

哎呀,文本框传输的代码没有像我想的那样干净利落。感谢您指出了这一点。现在应该修复! – 2010-03-31 15:00:35

回答

0

看来,问题的MatchFilter正在在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

成反向关系的默认名称为MODELNAME _set,所以你应该尝试:

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

或更好,添加related name到田间地头声明,然后用你写的查询:

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

它仍然给我一个FieldError:“无法解析关键字'notify_set'到字段中。”错误。当我尝试添加related_name参数并仅使用“notify”时,情况也是如此。 – 2010-03-31 12:29:15