【问题标题】:How to store a dictionary in a Django database model's field?如何在 Django 数据库模型的字段中存储字典?
【发布时间】:2021-09-15 18:41:59
【问题描述】:

我想将此字典列表存储在 Django 数据库中:

h =  [

{'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 3, 11),
  'debe': 500.0},
 {'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 4, 11),
  'debe': 500.0},
 {'sale_id': 15,
  'name': 'Yamila',
  'fecha': datetime.date(2021, 4, 14),
  'debe': 2000.0}

] 

我试过了:

h = tabla_creditos()

class Creditos1(models.Model):

    sale_id = models.IntegerField(default=0)
    name = models.CharField(max_length=150)
    fecha = models.DateTimeField(default=datetime.now)
    debe = models.IntegerField(default=0)

for i in range(0,len(h)):
    Creditos1.objects.create(name=h[i]['name'], sale_id=h[i]['sale_id'], fecha=h[i]['fecha'], debe=h[i]['debe'])

其中“h”是那个字典,它来自“tabla_creditos()”函数。然后,我尝试使用“objects.create”为数据库创建值,但我得到了存储在数据库中的重复值:

那么,我怎样才能将该字典存储在数据库中?

我找到了这个解决方案:How to store a dictionary in a Django database model's field,但没有一个答案对我有帮助。

谢谢!

编辑 有了 Rohith 的回答,我得到了这个:

但我想要这样的东西,在数据库列中转换字典的每个键:

【问题讨论】:

标签: python django


【解决方案1】:

有几种方法可以在模型中保存字典。我提到了 JSON 字段的使用。

如果您使用 PostgreSql 作为数据库,那么您可以访问 JSON 字段。您可以在documentation 中了解它。这将使您可以将字典保存为 Django 支持的 JSON 文件

例如:

from django.contrib.postgres.fields import JSONField

class Creditos1(models.Model):
    dict_info = JSONField(default=dict)

在你的代码中

sample_dict =  [

{'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 3, 11),
  'debe': 500.0},
 {'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 4, 11),
  'debe': 500.0},
 {'sale_id': 15,
  'name': 'Yamila',
  'fecha': datetime.date(2021, 4, 14),
  'debe': 2000.0}

]

credit = Creditos1.objects.create(dict_info=sample_dict)

如果您使用任何其他数据库,我建议将字段创建为 CharField()。然后将 dict 编码为 JSON 字符串并将该字符串保存到 Credit。然后你可以将 JSON 字符串解码回来。

例如:

class Creditos1(models.Model):
    dict_info = CharField(blank=True, null=True)

在您的代码中:

import json
sample_dict =  [
    
    {'sale_id': 14,
      'name': 'Macarena',
      'fecha': datetime.date(2021, 3, 11),
      'debe': 500.0},
     {'sale_id': 14,
      'name': 'Macarena',
      'fecha': datetime.date(2021, 4, 11),
      'debe': 500.0},
     {'sale_id': 15,
      'name': 'Yamila',
      'fecha': datetime.date(2021, 4, 14),
      'debe': 2000.0}
    
    ]
    encoded_json = json.dumps(sample_dict)
    credit = Creditos1.objects.create(dict_info=encoded_json)

为了获取dict的值,可以使用json.loads()

decoded_data = json.loads(credit.dict_info)
print(decoded_data[0]["name"])

更新

据我了解,函数 tabla_creditos() 仍不清楚,这可能是创建多个对象的原因,甚至可能是您可能没有已清除数据库(使用代码删除所有记录Creditos1.objects.all().delete())。

如果您想将字典列表保存为每个对象,(假设您有一个干净的数据库) 你的代码:

h = some_func()
uniquefied_list = list({v['sale_id']:v for v in h}.values())
for x in range(0, len(uniquefied_list)):
    Creditos1.objects.get_or_create(name=h[x]["name"], debe=h[x]["debe"]....)

在这里,get_or_create 将是处理此问题的更好方法这是documetation

希望这能解决您的问题。

【讨论】:

  • 谢谢!但我正在使用 SQLite,我收到了这个错误:“sqlite3.InterfaceError:错误绑定参数 0 - 可能是不受支持的类型。”
  • @SilvioAranda:正如我所提到的,这适用于 PostgreSQL。如果您使用的是 SQLite,我们可能需要查看其他选项,我会尽可能更新答案:)
  • 感谢 Rohith,它可以工作,但我遇到了另一个问题,我会更新我的问题。我希望你能帮助我:) 再次感谢!
  • @SilvioAranda 我已经更新了答案,如果您有其他问题,请创建另一个主题,我可以尝试一下(您可以在此处添加评论)。
  • 谢谢 Rohith,“uniquefied_list”返回唯一的“sale_id”,但我得到了 2 个不同日期的“sale_id”(“fecha”),我想保留这两个,因为这是两个不同的销售。我创建了另一个线程:stackoverflow.com/questions/68273452/…。谢谢!
【解决方案2】:

使用 JSON 字段。请注意,SQLite 不支持它

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 2017-08-26
    • 1970-01-01
    • 2010-09-28
    • 2016-02-11
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多