сохранить dict с помощью dicts

#python #json #postgresql #dictionary

#python #json #postgresql #словарь

Вопрос:

Я хочу сохранить данные json в postgresql, json выглядит так:

  {
    "Name": "transcordero",
    "Direction": "jardin alto 9096",
    "Com": "La Florida",
    "Region": "Regiu00f3n Metropolitana de Santiago",
    "DirectionGeopy": "Jardu00edn Alto, Condominio Parque la Portada, La Florida, Provincia de Santiago, Regiu00f3n 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 для хранения списка dicts внутри Categories , но я продолжаю получать эту ошибку: Error while connecting to PostgreSQL can't adapt type 'dict'

Комментарии:

1. Нет однозначного сопоставления словаря со списком (что, по сути, является полем массива) — вы могли бы сохранить словарь как текст, но это помешало бы вам запрашивать его содержимое. Вы можете сохранить словарь как запись в отдельной таблице и ссылаться на нее из основной записи. Или вы можете придумать конкретный способ сопоставления словаря со списком и добавить его.

2. @Grismar ну, postgres изначально понимает JSON, существует тип JSON. Я не уверен, как это будет работать с django (который, предположительно, используется), поскольку это специфичный для postgres тип

3. Ах, вы, конечно, правы, но тогда я бы также ожидал, что вы будете использовать a JSONField из Django? docs.djangoproject.com/en/3.1/ref/contrib/postgres/fields

4. Я решил это с помощью JSONField, работает отлично

Ответ №1:

Решил это с помощью JSONField для Categories и ExtCode в моих моделях, вот так:

 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'])