#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/fields4. Я решил это с помощью 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'])