【问题标题】:ArrayField with JSONField as base_field in DjangoArrayField 与 JSONField 作为 Django 中的 base_field
【发布时间】:2018-10-06 20:01:52
【问题描述】:

我有一个 GooglePlace 模型,其中有一个字段来存储由 Google Places API 返回的 address_components。

模型.py

address_components = ArrayField(JSONField(), null=True, blank=True)

我正在尝试像这样存储数据

address_components = [component for component in google_place_details.get("address_components")]

但我收到此错误:

列“address_components”是 jsonb[] 类型,但表达式是 输入文本[] 第 1 行:...

'2018-04-26T07:49:02.101395+00:00'::timestamptz, ARRAY['{"l... ^ 提示:您需要重写或转换表达式。

我试过 json.dumps 每个组件,编码。但我觉得我错过了一些愚蠢的东西。

任何帮助将不胜感激

这是示例响应:

"address_components":[  
   {  
      "long_name":"Chennai",
      "short_name":"Chennai",
      "types":[  
         "locality",
         "political"
      ]
   },
   {  
      "long_name":"Ramagiri Nagar",
      "short_name":"Ramagiri Nagar",
      "types":[  
         "sublocality_level_2",
         "sublocality",
         "political"
      ]
   },
   {  
      "long_name":"Velachery",
      "short_name":"Velachery",
      "types":[  
         "sublocality_level_1",
         "sublocality",
         "political"
      ]
   },
   {  
      "long_name":"Chennai",
      "short_name":"Chennai",
      "types":[  
         "administrative_area_level_2",
         "political"
      ]
   },
   {  
      "long_name":"Tamil Nadu",
      "short_name":"TN",
      "types":[  
         "administrative_area_level_1",
         "political"
      ]
   },
   {  
      "long_name":"India",
      "short_name":"IN",
      "types":[  
         "country",
         "political"
      ]
   },
   {  
      "long_name":"600042",
      "short_name":"600042",
      "types":[  
         "postal_code"
      ]
   }
],

【问题讨论】:

    标签: json django python-3.x django-models models


    【解决方案1】:

    您无需将 JSON 数据包装在 ArrayField 中。您可以将address_components 列表直接存储到JSONField

    【讨论】:

    • 我试过这个GooglePlace.objects.get_or_create(**google_place_details) 仍然得到同样的错误
    • 您是否将address_componentsmodel 字段更改为JSONField
    • 我明白了。您需要将其更改为仅JSONField
    • 哦!感谢工作的人。但是如果我想将它存储为 JSON 数组呢?
    • 它现在将作为 JSON 存储在 DB 中,并作为 listdicts 检索。如果要存储和检索 JSON 编码的字符串,请使用 TextFields 的 ArrayField 和 json 对 python 中的每个列表项进行编码。
    【解决方案2】:

    这是一个已知的错误https://code.djangoproject.com/ticket/28291

    我已将我的模型重构为 JSONField()

    发件人:address_components = ArrayField(JSONField(), null=True, blank=True)

    收件人:address_components = JSONField(null=True, blank=True)

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 2021-04-15
      • 2015-01-18
      • 2021-06-05
      • 2017-07-03
      • 1970-01-01
      • 2019-12-02
      相关资源
      最近更新 更多