【问题标题】:FieldError when annotating over foreign keys对外键进行注释时出现 FieldError
【发布时间】:2010-03-30 17:05:08
【问题描述】:

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

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),但我不知道为什么会出现错误。

返回的具体错误如下:

无法将关键字“通知”解析为字段。选择有:(Match 模型中的所有字段)

有没有人知道为什么我不能让这个注释跨表工作?在查看了其他 SO 问题和我见过的各种 Django 文档后,我感到很困惑。

编辑:我使用的是 Django 1.1.1

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

编辑 3:在重建我的模型文件后,我意识到包含 Alex Gaynor 的 django-filter 插件会导致问题。起初我认为这无关紧要,但既然现在如此,我已经包含了导致错误的 Match FilterSet 类。当我删除 MatchFilter 类时,它工作得很好。我正在尝试通过 django-filter 代码找出发生这种情况的原因,但如果其他人有想法,我会非常感兴趣!

【问题讨论】:

  • 与你的问题无关,但MatchFilter有缩进错误。
  • 哎呀,文本框传输的代码没有我想象的那么干净。感谢您指出了这一点。现在应该修好了!

标签: django orm django-filter


【解决方案1】:

反向关系的默认名称是modelname_set,所以你应该试试:

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

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

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

【讨论】:

  • 它仍然给我一个 FieldError:“无法将关键字 'notify_set' 解析为字段。”错误。当我尝试添加相关名称参数并仅使用“通知”时也是如此。
【解决方案2】:

问题似乎是在 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。

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2018-12-25
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多