在django的测试中找不到Postgres函数json_array_elements

SAK*_*isT 0 python django postgresql json

我在使用json_array_elements函数的django模型中有类方法.

如果它通过浏览器执行它可以正常工作.但在测试中失败了. python manage.py test

Traceback (most recent call last):
  File "path_to_project/dj_server/model_animations/tests.py", line 94, in test_cteating
    response_first = model_animations.views.get_animations_list(request, groupid)
  File "path_to_project/dj_server/model_animations/views.py", line 37, in get_animations_list
    for model_anim in listArray:
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 1535, in __iter__
    query = iter(self.query)
  File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 76, in __iter__
    self._execute_query()
  File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 90, in _execute_query
    self.cursor.execute(self.sql, self.params)
  File "/Library/Python/2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/Library/Python/2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Library/Python/2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
ProgrammingError: function json_array_elements(text) does not exist
LINE 1: ...on_name FROM model_animations_model, json_array...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

在models.py中

@classmethod
def animations_list(self, group_id):
    if group_id:
        try:
            listArray = ModelAnimationList.objects.raw(('SELECT * FROM model_animations_model, json_array_elements(animated_groups) AS data WHERE \'"%s"\' = data::text' %group_id))
            return listArray
        except:
            pass
    return None
Run Code Online (Sandbox Code Playgroud)

在views.py def get_animations_list(request,group_id)中:...

listArray = ModelAnimationList.animations_list(group_id)
if listArray:
    for model_anim in listArray:
        if model_anim:
            anim_dict = { 'a_id'  : model_anim.id, 'a_name' : model_anim.animation_name }
            result_anim_list.append(anim_dict)

...
Run Code Online (Sandbox Code Playgroud)

在tests.py中

request = HttpRequest()
response_first = model_animations.views.get_animations_list(request, groupid)
Run Code Online (Sandbox Code Playgroud)

安装:
python 2.7
Django 1.7.1
Postgres 9.3.5
psycopg2 2.5.4
Mac 10.10优胜美地

SAK*_*isT 10

查询中的错误 json_array_elements(animated_groups)

需要改变这个: json_array_elements(animated_groups::json)

  • 对我来说,我必须使用“to_jsonb”。例如 `json_array_elements(to_jsonb(items))` (2认同)

Yog*_*mar 6

Postgres JSON 处理函数,例如json_array_elements(animated_groups::json),jsonb_array_elements(animated_groups::jsonb)将采用jsonjsonb值。

因为 postgres JSON field( animated_groups) 是以文本格式或二进制格式存储的。所以我们需要通过使用::json或者::jsonb它给出 json 或 jsonb 格式来转换类型

在这里检查