【问题标题】:store a dict with dicts用字典存储字典
【发布时间】:2020-11-09 02:53:06
【问题描述】:

我想将 json 数据存储到 postgresql 中,json 看起来像:

 {
    "Name": "transcordero",
    "Direction": "jardin alto 9096",
    "Com": "La Florida",
    "Region": "Regi\u00f3n Metropolitana de Santiago",
    "DirectionGeopy": "Jard\u00edn Alto, Condominio Parque la Portada, La Florida, Provincia de Santiago, Regi\u00f3n Metropolitana de Santiago, 8240000, Chile",
    "Categorias": [
      { "Category": "Servicios de transporte, almacenaje y correo " },
      { "Category": "Servicios de transporte, almacenaje y correo " },
      { "Category": "Servicios de transporte, almacenaje y correo " }
    ],
    "ExtCode": [
      { "Code": "1499-461-CM14" },
      { "Code": "711841-19-CM14" },
      { "Code": "1499-370-CM14" }
    ],
    "lat": -33.5235648,
    "lon": -70.5613059
}

这是我的模型:

class Bidder(models.Model):

    Name_org= models.CharField(max_length=500)
    direction_uni = models.CharField(max_length=500)
    com_uni = models.CharField(max_length=500)
    region_uni = models.CharField(max_length=500)
    direction_uni_compl = models.CharField(max_length=500)
    categories = ArrayField(models.CharField(max_length=500,default="none"))
    ext_code = ArrayField(models.CharField(max_length=100,default="none"))
    latitude = models.FloatField()
    longitude = models.FloatField()

我尝试使用 ArrayField 将字典列表存储在 Categories 中,但我不断收到错误消息:Error while connecting to PostgreSQL can't adapt type 'dict'

【问题讨论】:

  • 没有字典到列表的一对一映射(本质上就是数组字段)-您可以将字典存储为文本,但这会阻止您查询它内容。您可以将字典作为记录存储在单独的表中,并从主记录中引用它。或者你可以想出一个特定的方法来将字典映射到一个列表并添加它。
  • @Grismar 很好,postgres 原生理解 JSON,有一个 JSON 类型。我不确定这将如何与 django 一起使用(可能正在使用),因为它是 postgres 特定类型
  • 啊,你当然是对的,但我也希望你使用来自 Django 的JSONFielddocs.djangoproject.com/en/3.1/ref/contrib/postgres/fields
  • 我用 JSONField 解决了,效果很好

标签: python json postgresql dictionary


【解决方案1】:

在我的模型中使用 CategoriesExtCode 的 JSONfield 解决了这个问题,如下所示:

class Bidder(models.Model):

    Name_org= models.CharField(max_length=500)
    direction_uni = models.CharField(max_length=500)
    com_uni = models.CharField(max_length=500)
    region_uni = models.CharField(max_length=500)
    direction_uni_compl = models.CharField(max_length=500)
    categories = models.JSONField(null=True)
    ext_code = models.JSONField(null=True)
    latitude = models.FloatField()
    longitude = models.FloatField()

我也不得不修改查询:

postgres_insert_query = """ INSERT INTO colection_bidder (Name_org, direction_uni, com_uni, region_uni, direction_uni_compl, categories, ext_code, latitude, longitude) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
record_to_insert = (i['Name'], i['Direction'], i['Com'], i['Region'], i['DirectionGeopy'], json.dumps(i['Categories'], separators=(',',':')), json.dumps(i['ext_code'], separators=(',',':')), i['lat'], i['lon'])

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多