JSONField
フィールドからサブキーを抽出し、Querysetの値に注釈を付けることは可能ですか?私は、Pythonコードの後処理ではなく、クエリ内の値を抽出しようとしています。クエリ中に `django.models.F`または同様のメソッドを使用してDjango JSONFieldのキーにアクセスするにはどうすればよいですか?
モデルのアーキテクチャは次のとおりです。
- ジャンゴ1.10
- モデルは、APIの応答を格納するためのdjango.contrib.postgres.fields.JSONField
called
data`を持っています。この例はTwitterです。 - 他のフィールドは
profile_id
とscreen_name
です。残りのデータはdata
フィールドに格納されているため、アドホックで照会することができます。
私はannotate
とdjango.models.F
を組み合わせることができるだろうと思ったが、私は次のエラーを取得しています:
> models.TwitterUser.objects.annotate(foll_count=F("data__followers_count"))
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/query.py", line 914, in annotate
clone.query.add_annotation(annotation, alias, is_summary=False)
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/sql/query.py", line 971, in add_annotation
summarize=is_summary)
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/expressions.py", line 463, in resolve_expression
return query.resolve_ref(self.name, allow_joins, reuse, summarize)
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1462, in resolve_ref
self.get_initial_alias(), reuse)
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1402, in setup_joins
names, opts, allow_many, fail_on_missing=True)
File "/Virtualenv/env_name/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1370, in names_to_path
" not permitted." % (names[pos + 1], name))
django.core.exceptions.FieldError: Cannot resolve keyword 'followers_count' into field. Join on 'data' not permitted.
私はそれをリバースエンジニアリングしようとしていますので、これを明示的にどこにも文書化されていませんDjangoの別の場所で使用されている二重のアンダースコアを使用します。私は、それがネイティブのPythonのdict(F("data")[followers_count"]
)のように別々にキーにアクセスしようとしましたが、それもうまくいきませんでした。
直接的な回答や他の分野への指針は認められます。
同様の問題を抱えている誰かが見つかりました - http://hatethatcode.com/writing-queries-for-django-models-with-jsonfield.html - rawsqlが今のところORMはJSONFieldのアプローチに追いついています。 –