簡體   English   中英

Django外鍵計數過濾器

[英]Django foreign key count filter

我有以下兩種模型:

Class Foo(models.model):
    param1 = ...
    param2 = ...
    ...
    paramN = ...

Class Bar(models.model):
    foo = models.ForeignKey(Foo)
    ...
    ...

目標:計算所有Foo實例的QuerySet,以便將多個Bar實例連接到它

我一直在尋找解決方案,這似乎對其他所有人都有效

Foo.objects.annotate(num_bar=Count('bar')).filter(num_bar__gt=1)

這給了我一個FieldError'bar'對於Foo不是一個可能的字段,然后我嘗試了'bar_set'並且也得到了同樣的錯誤

我是否有可能錯誤地實施它們,或者因為它們很舊而現在已經貶值了? 任何幫助,將不勝感激!

追溯

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/query.py", line 794, in annotate
    obj.query.add_annotation(annotation, alias, is_summary=False)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 982, in add_annotation
    summarize=is_summary)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/aggregates.py", line 20, in resolve_expression
    c = super(Aggregate, self).resolve_expression(query, allow_joins, reuse, summarize)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/expressions.py", line 491, in resolve_expression
    c.source_expressions[pos] = arg.resolve_expression(query, allow_joins, reuse, summarize, for_save)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/expressions.py", line 448, in resolve_expression
    return query.resolve_ref(self.name, allow_joins, reuse, summarize)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1532, in resolve_ref
    self.get_initial_alias(), reuse)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1471, in setup_joins
    names, opts, allow_many, fail_on_missing=True)
  File "/home/ryan/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1396, in names_to_path
    "Choices are: %s" % (name, ", ".join(available)))
FieldError: Cannot resolve keyword 'bar' into field. Choices are: param1, param2, param3, ..., paramN

我的Django版本是1.8.3

該錯誤可能有多種原因,我將嘗試說明可能的原因:

  1. 最近升級django版本可能會引起問題,請清除遷移,然后重新運行。
  2. 從本地服務器移動到生產服務器有時會導致此問題。
  3. 如果您的應用名稱以“ __”開頭,則可能會引起問題。
  4. 嘗試其他更簡單的查詢(如果可行),請嘗試更改查詢,以免使用num_model
  5. 還檢查是否可以得到它們的數量(骯臟的方式:)):

    for foo in Foo.objects.all(): if foo.bar_set.count() < 2: #do sth like : foo.bar_set.get() or temp = temp + 1

從您對模型的簡短描述(不是您的主代碼)開始,找不到其他原因。 您的查詢應該可以。

因此,在嘗試了很多之后,這是一個可行的解決方案:

Bar.objects.values("foo_id").annotate(Count("foo_id")).filter(pk__count__gt=1)

不能完全確定為什么這樣做有效,而另一個則無效,但實際上,它只是獲取具有相同foo_idBar對象的數量,並確保存在多個對象。

如果有人想解釋一個可行的原因,而另一個卻不可行,那將不勝感激。

由於輸入錯誤,我遇到了同樣的問題。 這是我的用例的解決方案

# from django.db.models.sql.aggregates import Count  # wrong import
from django.db.models import Count   # correct one

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM